Java基礎—面向對象

  java是面對對象的計算機語言,在沒接觸java以前,此句就耳熟能詳。但是具體什麼意思,確一竅不通。看了畢老師的視頻,如醍醐灌頂。結合老師的講解和我的瞭解,寫了這篇博客。

  面向對象是相對於面向過程而言的。面向對象,將功能封裝進對象,強調的是具備一定功能的對象。面向過程強調的是功能。比如C語言,在編程的時候,思考方式是如何實現指定的功能,而java是去尋找對象,調用對象的功能,若沒有建一個,再使用。經典例子:大象放進冰箱、買電腦等。兩者的關係:面向過程是面向對象的基礎。面向對象的特點:把複雜的事情簡單化,人從執行者轉變爲指揮者。面向對象的特徵:封裝、繼承、多態。java只能單繼承,但可以多實現。類和對象的關係:類是java用於描述事物的,而對象是現實中實實在在存在的個體。比如汽車和圖紙,圖紙相當於類,而汽車相當於對象。

  匿名對象的使用情景:1、當對象方法只調用一次時;2、可以將匿名對象作爲實際參數進行傳遞。

注:私有隻是封裝的一種方式.

以下是最簡單的面向對象編程的結構:

/*
面向對象:對象在java中已實體的形式存在,存儲在堆內存中。
 落實到程序:
            1、先定義對象,把功能封裝進對象;
            2、創建對象;
            3、通過對象.成員的方式來使用。(成員包括:成員變量和成員方法)
 注:如果成員是靜態的,則另一種調用方式:類名.成員

 其他說明:
          在一個類中,有除了參數列表不同外其他都相同的函數,這叫函數的重載現象。
          子父類(實現接口)中,相同的函數,函數體不同叫函數的複寫或覆蓋,

 靜態的特點:隨着類的加載而加載,類的消失而消失;
             被所有對象共享;
             存放在方法區(對象存在於堆內存中,局部變量存在於棧內存中);
             靜態只能訪問靜態,存在的週期長。

 靜態代碼塊、構造函數、一般方法的執行順序:先執行靜態代碼塊(之間按先後順序執行,主函數所在類的靜態代碼塊優先與其他類)、
                                           建立對象時執行構造函數、在通過對象調用其他方法。
                                           所以下面代碼的打印順序爲:d、e、a、b、c、over;

 由於不確定該類的對象會存在HashSet還是TreeSet的集合裏,所以需要複寫hashCode、equals方法,
 還要實現Comparable接口,複寫compareTo方法。
*/
//描述事物
class Car implements Comparable<Car>
{
    //類中的成員變量被private修飾,一般都要在該類中定義兩個方法,設置和獲取
    private String color;
    //構造函數的函數名跟類名一致,在一個類中可以有多個構造函數,以重載的方式存在
    Car(String color)
    {
        this.color = color;
        System.out.println("b");
    }
    //靜態代碼塊,隨着類的加載而執行。優先於對象存在
    static
    {
        System.out.println("a");
    }
    //操作color變量的設置方法
    public void setColor(String color)
    {
        this.color = color;     
    }
    //獲取color值的方法
    public String getColor()
    {
        return color;
    }
    //Car中的成員方法
    public void run()
    {
        System.out.println("c");
    }
    //複寫hashCode方法
    public int hashCode()
    {
        return color.hashCode();
    }
    //複寫equals方法
    public boolean equals(Object obj)
    {
        if(!(obj instanceof Car))
            throw new ClassCastException("不是Car類型");
        Car c = (Car)obj;
        return this.color.equals(c.color);
    }
    //複寫compareTo方法,主要條件相同的時候,需要比較次要條件
    public int compareTo(Car c)
    {
        return this.color.compareTo(c.color);
    }
}
class CarDemo
{
    static
    {
        System.out.println("d");
    }
    //主函數:特殊的函數,能被虛擬機jvm識別調用,程序的入口
    public static void main(String[] args) 
    {
        //建立Car對象
         Car c = new Car("red");
         //調用對象方法
         c.run();
         System.out.println("over");
    }
    static
    {
        System.out.println("e");
    }
}

單例設置模式:餓漢式和懶漢式。

/*
單例設計模式:保證某個類在內存中只有一個對象。
分爲餓漢式和懶漢式,懶漢式也稱爲對象延時加載。
單例設計模式的實現步驟:
                       1、將空參數的構造函數私有化;
                       2、在類的內部創建該類對象;
                       3、對外提供一個獲取該類對象的方法。

 注:因爲懶漢式對象延時加載,所以需要同步(當一個線程在執行某一塊代碼時,不允許其他線程參與進來)。
      同步代碼的格式:synchronized(對象){同步代碼;}這裏對象就是鎖,只有持有鎖才能執行同步代碼,

*/
class Single
{
    //餓漢式
    private Single(){}
    Single s = new Single();
       //因爲不允許創建該類對象,所以獲取該類對象的方法應爲靜態
    public static Single getSingle()
    {
        return s;
    }
    //懶漢式
    private Single(){}
    Single s = null;
    public static Single getSingle()
    {
        if(s == null)
        {
               //給s賦值有兩句語句,爲了避免多次給s賦值,所以需要同步,鎖是字節碼文件
            synchronized(Single.class)
                {
                if(s == null)
                s = new Single();
            }
        }
        return s;
    }
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章