面向對象1 --- 思想和基本概念

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);
    }
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容