【Java 小白菜入門筆記 2.1】面向對象相關

實驗網址:https://www.shiyanlou.com/courses/1230

類(class)

作爲面向對象的Java,一切皆對象(類的實例)。用關鍵字class定義。
類中含有屬性(變量)和方法(函數)。
變量的類型:

  1. 局部變量(定義在方法體中,用完就銷燬);
  2. 成員變量(顧名思義,即class的成員,定義在方法體外,class內,這種可以被方法訪問,在創建class的對象時即實例化);
  3. 靜態變量(用static聲明,位置與成員變量一樣)

創建對象的方法

類名 對象名 = new 類名()

其實這個在前面創建基本數據類型的時候已經描述過了。比如int、string之類。如String類:

String str = new String("test")

需要注意的一個問題:局部變量和成員變量重名時,局部變量具有更高優先級。

構造方法:與類名同名,無返回值。
如果不寫構造方法,則自動生成一個無參構造方法,如果寫了,則不再生成無參數的構造方法。另外,多個不同的構造方法可以實現重載。

對象名實際上指代的是一個對對象實例的引用。用 == 來比較兩個對象名,則實際上是在比較這兩個對象名是不是指向同一個對象。(與C中的指針類似)。

static:靜態變量和靜態方法。這個是屬於class共有的,而非其一個實例(對象)所有。因此,用static修飾的變量或方法可以不通過對象,而是直接用class來訪問。
由此可以合理推出:static的方法裏面不能用this,也不能用非靜態的變量和方法。因爲這些東西都必須經過了實例化才能用。如果static裏面調用了這些非靜態的,那麼也就沒法直接用class調用了。

class的概念有點類似柏拉圖的理念。一匹理念世界的馬可以形成現實世界中的多匹不同的馬,而static則表示了馬的一些固有屬性,比如 num_legs = 4,或者has_tail = true,或者定義一個方法 run()。這些屬性和方法是所有的馬共有的,也就是馬這個理念所帶有的。因此不需要實例化一匹馬出來,我們就能知道所有的馬都是四條腿的。

final關鍵字:顧名思義,final 爲最終版的意思,用final修飾的class不能被繼承,修飾的方法不能被重寫,修飾的變量不能被修改(也就成了常量)。

權限修飾符:public、private、protected
其中 public爲公開,所有都可以用
private僅限於本class中用。
protected爲本class和子類可用。
如果不加修飾符,則本類和同包內可用。

class中進行封裝,通常會設置setter和getter方法,用於讀取和修改private var。其好處是可以在方法中進行一些控制,比如過濾非法字符,保證安全。

this關鍵字用來調用屬性和方法,和python類似。

繼承:子類(派生類)繼承父類(基類)。
格式爲:

class 子類 extends 父類

繼承的作用:代碼複用。
繼承可以實現的功能:除了private,父類的屬性和方法可以訪問和使用。另外,還可以重寫父類的函數。當然,也可以在加入自己的屬性和方法。
Java的繼承是單繼承。

在子類中調用父類時,用super關鍵字。
比如 super.屬性 super.方法 可以獲得父類的屬性和方法
而在子類最前面super(),可以調用父類的構造函數

重載:需要保證參數不同;
重寫:需要保證參數、返回值類型數量相同。

多態:必要條件:繼承、重寫、向上轉型。
向上轉型: 父類名 對象名(引用) = new 子類名()
也就是說,引用是父類的引用,子類必然包含了父類的變量和方法,因此可行(相反則不行)。
向上轉型後,子類特有的變量方法被遺忘,父類的部分方法可能被重寫。

抽象類:以abstract關鍵字標識,可以含有抽象方法,即只聲明,不實現。不能直接實例化一個抽象類,需要用子類進行繼承重寫。往往加上@override標記出重寫的方法。

接口:用interface標識。基本形態如下:

// MyInterface.java
interface MyInterface{
	int label = 1; // static final類型
	public void MyMethod(); // 必須爲抽象類
}

前面說了,Java裏class不能多繼承,但是interface可以。

// 多重繼承的實現,interface 用 extends 繼承
修飾符 interface A extends 接口1,接口2{
}
// class 實現接口,需要用 implements
修飾符 class A implements 接口1,接口2{
}

接口 和 接口的方法 都是隱式抽象的,不寫abstract也是抽象。
接口的方法都是public的。
接口的變量都是靜態常量,也是public的。
換句話說,接口的方法都是自帶這個的: public abstract
而接口的變量, 自帶這個修飾符:public static final

一個類class要是想實現接口,必須實現其中所有的方法。
如果不實現,那麼這個class也必須是一個abstract 抽象類。

內部類:就是類中定義的類,套娃。
內部類編譯完成後和外部類是兩個class,因此可以方法變量的同名。
內部類可以使用外部類的所有方法和變量。

內部類如何進行實例化?一個栗子:
這裏People爲外部類,Student爲內部類。stuInfo爲Student內部類的一個成員函數。

People a = new People();     //創建外部類對象,對象名爲a
Student b = a.new Student(); //使用外部類對象創建內部類對象,對象名爲b
							 // 或者爲 People.Student b = a.new Student();
b.stuInfo();   //調用內部對象的suInfo方法

可以看到,這個new用的是已經實例化的一個外部類的對象的new,其它操作都一樣。

內部類裏面不能有static,因爲static不需要實例化就能用,而內部類必須要用實例化後的外部類的對象進行創建。

對內部類加一個static,就成了 靜態內部類。
靜態內部類的特點,它只能訪問(直接訪問,不用new對象的那種)外部類的static變量。
另外,靜態內部類可以直接創建: 內部類名 a = new 內部類名(),不再需要先創建一個外部類再創建內部類。

package :包,是用來區分class的命名空間的。
包的目錄結構用點分割,包名都是小寫。

2020-06-30 01:32:04
北京 永豐

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