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;
}
}