概述:
面向對象,就是先把具有相同特徵和功能的一類事物,抽出相同特性寫成一個抽象的類,再創建這個類類型的對象,每個對象就是一個個體,擁有之前類中定義的屬性和方法,不同的對象相同屬性的值可以不同。
面向對象比較強調把一些功能封裝到一個對象裏,讓這個對象去完成相應功能,但具體如何完成的細節不用去管。
比如,一輛黑色汽車跟一輛白色汽車,都是兩個個體,但它們都是汽車,都有顏色這個屬性,只是顏色不同而已。然後黑車跟白車都有“到加油站去加油”這個行爲即方法, 需要加油時,調用 “黑車.去加油” 就好了,具體走哪條路去的加油站這個就不用管了,忽略了細節。
我們可以定義一個類,這個類封裝了所有汽車的共同屬性和行爲,然後再創建一個這個類的實例,即對象。
代碼分析:
class Car { //定義一個類,這個類封裝了汽車這類事物的共性。
String color;
int num;
color = "red";
num = 4;
void show() {
System.out.print(color+" "+num);
}
}
//創建一個Car對象,這個對象是上面那個類的個體。
class Demo {
public static void main(String[] args) {
Car c = new Car(); //創建一個Car類型的對象,存儲在堆內存
c.color = "black"; //把這個對象的color屬性修改爲“black”
c.show; //使用這個對象的show()函數,函數中封裝功能
}
}
內存圖解:
內存分析:
(1)創建對象時,先在堆內存中給對象分配一個內存空間,假如這個空間地址爲0x0034。
(2)在這個空間中,創建一個對象,並定義兩個成員變量,爲 color 和 num (成員變量隨着對象的建立而建立,存在於堆內存中,且有默認初始化值),color 初始化爲 "red" ,num 初始化爲 4。
(3)在棧內存中分配一個內存空間給局部變量 c,並把對象的內存地址賦給變量c,即把 0x0034 賦給 c。變量 c 即通過這個內存地址,指向了堆內存中的對象。
(4)c.color = "black"; 即通過c指向堆內存中的對象,把對象的 color 變量改爲"black"。
(5)c.show(); 調用對象的 show() 方法。
匿名對象:
匿名對象是對象的簡化形式,匿名對象的兩種使用情況:
(1)當對對象的方法僅進行一次調用時。
(2)匿名對象可作爲函數的實際參數進行傳遞。
第一種情況:
new Car().num = 5; //第一種情況,對對象僅進行一次調用。
new Car().color = "black";//實際是創建了兩個對象
第二種情況:
class Test{} {
public static void main(String[] args) {
turn(new Car()); //turn()函數調用了Car類型對象,當調用完畢時,此對象不被調用則成爲垃圾。
}
public static void turn(Car c) {
c.num = 3;
c.color = "black";
}
}
成員變量:
(1)成員變量定義在類中,在整個類中都可以被訪問。
(2)成員變量隨着對象的建立而建立,存在於對象所在的堆內存中。
(3)成員變量有默認初始化值。
局部變量:
(1)局部變量只定義在局部範圍內,如:函數內、語句內。
(2)局部變量存在於棧內存中,且作用的範圍結束,變量空間會自動釋放。
(3)局部變量沒有默認初始化值。