1 基本思想
面向對象與面向過程的特點
面向過程,強調的是過程(動作),比如,把水果存進冰箱,面向過程的思想是這樣的:
打開冰箱
存儲水果
關閉冰箱
面向對象,強調的是對象(實體),是對象本身具備什么樣的功能,比如,把水果存進冰箱,面向對象的思想是這樣的:
冰箱打開
冰箱存儲
冰箱關閉
對象對功能進行了封裝,找到對象,就是找到了功能,想實現什么功能,就調用具備什么功能的對象即可。
對象的出現,是為了封裝數據,數據多了,可以考慮建一個對象封裝起來
2 類(Class) 與 對象(Object) 之間的關系
用 Java 語言,對現實生活中的事物進行描述,是通過 類(Class) 的形式體現的。
怎么描述?
對事物的描述,通常只關注兩個方面
- 屬性 : 成員變量
- 行為 : 成員函數
只要明確該事物的 屬性 和 行為 , 并定義在類中即可。
對象:類的實例,在 Java 中,通過 new 來創(chuàng)建對象。除了8種基本類型外,還有3種引用類型,數組類型, 類類型,接口類型
3 對象的內存體現
堆中存的都是實體,棧中存的都是引用類型
Car c = new Car();
- 凡是 new 的對象,都存在堆中
- 堆內存中的對象,默認初始化
- 將 new Car() 的地址,賦給 c
多個引用,指向同一個對象
Car c1 = new Car();
Car c2 = c1;
c1.num = 8;
c2.color = "red";
c1.run(); // 8, red
c1 = null; // c1 指向空,c2仍然能用
4 成員變量 和 局部變量
成員變量定義在類中,整個類中都可以訪問。
局部變量定義在函數,語句,局部代碼塊中,只在 所屬的區(qū)域有效。
成員變量存在于堆內存的對象中。
局部變量存在于棧內存的方法中。
成員變量隨著對象的創(chuàng)建而存在,隨著對象的消失而消失。
局部變量隨著所屬區(qū)域的執(zhí)行而存在,隨著所屬區(qū)域的結束而釋放。
成員變量都有默認初始化值。
局部變量沒有默認初始化值。
5 匿名對象
匿名對象,沒有名字的對象。
new Car(); // 匿名對象,其實就是 定義對象的 簡寫格式。
1 當對象,對方法僅進行一次調用的時候,就可以簡化成匿名對象。匿名對象沒有任何引用和指向,運行完就結束了。
Car c = new Car();
c.run();
new Car().run();
new Car().num = 5;
new Car().color = "green";
new Car().run();
// 分析:其實這是3個對象,
// new Car().num = 5; new Car()是創(chuàng)建一個新對象 .num=5; 是為新對象賦值
// 在運行第二句話new Car().color = "green";的時候,第一句話就已經成了垃圾;
2 匿名對象可以作為實參進行傳遞
Car c1 = new Car();
// show(c1);
show(new Car()); // 作為實參進行傳遞,不變垃圾
6 數據傳遞
1 成員變量和局部變量的同名&顯示初始化
class Car
{
int num;
String color; // Java中,所有的關鍵字都是小寫的,這里的String,是類
void run()
{
int num = 10;
System.out.println(num+"..."+color);
}
}
class CarDemo
{
public static void main(String[] args)
{
Car c = new Car();/
c.num = 4;
c.run();
}
運行結果是 10
怎么分析程序:
c.run(); 執(zhí)行run方法,run()方法在棧中,棧里面有值,10,那么就輸出10,如果棧里面沒有值,再去堆里面找。
2 基本數據類型參數傳遞
class Demo
{
public static void main(String[] args)
{
int x = 3;
show(x); // 運行完出棧,離開內存,被釋放了
System.out.println("x="+x);
}
public static void show(int x)
{
x = 4;
// return; // 有個默認的 return
}
}
分析:輸出結果 x=3;
執(zhí)行過程:虛擬機先執(zhí)行主函數,在棧中,x=3;
接著執(zhí)行 show(x); show()進棧,show()函數里有自己的x; 主函數的x,賦值給了show()方法的x, 雖然都叫x,但是屬于不同的區(qū)間, 一開始 x=3,show()方法執(zhí)行代碼。代碼里給x賦值,賦值完后,x=4;
執(zhí)行完后,show()方法結束了,出棧。
3 引用數據類型參數傳遞
class Demo
{
int x = 3;
public static void main(String[] args)
{
Demo d = new Demo();
d.x = 9;
show(d);
System.out.println(d.x);
}
public static void show(Demo d)
{
d.x = 4;
}
}
這個函數,是在類里面,寫入了主方法,寫成下面的形式,更規(guī)范,更好理解
class Demo{
int x = 3;
public static void show(Demo d)
{
d.x = 4;
}
}
public static void main(String[] args)
{
// 在堆里新建一個Demo對象,對象屬性x默認為0,在 int x=3后,x被初始化為3
Demo d = new Demo();
// x變?yōu)?
d.x = 9;
/*
執(zhí)行 show(d),在執(zhí)行 show()方法的時候,傳參,d變?yōu)?,在show()方法內,d變?yōu)?,show(d)方法執(zhí)行完,出棧
*/
show(d); //show()執(zhí)行完出棧
// 打印d,d是在堆中,屬性是成員變量,現在d的屬性 x 值為4,所以輸出結果為4
System.out.println(d.x);
}