繼承extends
3.1、什么是繼承,有什么用?
繼承:在現(xiàn)實世界當中也是存在的,例如:父親很有錢,兒子不用努力也很有錢。
繼承的作用:
基本作用:子類繼承父類,代碼可以得到復用。(這個不是重要的作用,是基本作用。)
主要(重要)作用:因為有了繼承關(guān)系,才有了后期的方法覆蓋和多態(tài)機制。
3.2、繼承的相關(guān)特性
① B類繼承A類,則稱A類為超類(superclass)、父類、基類,
B類則稱為子類(subclass)、派生類、擴展類。
class A{}
class B extends A{}
我們平時聊天說的比較多的是:父類和子類。
superclass 父類
subclass 子類
② java 中的繼承只支持單繼承,不支持多繼承,C++中支持多繼承,
這也是 java 體現(xiàn)簡單性的一點,換句話說,java 中不允許這樣寫代碼:
class B extends A,C{ } 這是錯誤的。
③ 雖然 java 中不支持多繼承,但有的時候會產(chǎn)生間接繼承的效果,
例如:class C extends B,class B extends A,也就是說,C 直接繼承 B,
其實 C 還間接繼承 A。
④ java 中規(guī)定,子類繼承父類,除構(gòu)造方法不能繼承之外,剩下都可以繼承。
但是私有的屬性無法在子類中直接訪問。(父類中private修飾的不能在子類中
直接訪問??梢酝ㄟ^間接的手段來訪問。)
⑤ java 中的類沒有顯示的繼承任何類,則默認繼承 Object類,Object類是
java 語言提供的根類(老祖宗類),也就是說,一個對象與生俱來就有
Object類型中所有的特征。
⑥ 繼承也存在一些缺點,例如:CreditAccount 類繼承 Account 類會導致它
們之間的耦合度非常高,Account 類發(fā)生改變之后會馬上影響到 CreditAccount 類
繼承extends
1.1、測試:子類繼承父類之后,能使用子類對象調(diào)用父類方法嗎?
可以,因為子類繼承了父類之后,這個方法就屬于子類了。
當然可以使用子類對象來調(diào)用。
1.2、在實際開發(fā)中,滿足什么條件的時候,我可以使用繼承呢?
凡是采用“is a”能描述的,都可以繼承。
例如:
Cat is a Animal:貓是一個動物
Dog is a Animal:狗是一個動物
CreditAccount is a Account:信用卡賬戶是一個銀行賬戶
....
假設以后的開發(fā)中有一個A類,有一個B類,A類和B類確實也有重復的代碼,
那么他們兩個之間就可以繼承嗎?不一定,還是要看一看它們之間是否能夠
使用is a來描述。
class Customer{
String name; // 名字
// setter and getter
}
class Product{
String name; // 名字
// setter and getter
}
class Product extends Customer{
}
以上的繼承就屬于很失敗的。因為:Product is a Customer,是有違倫理的。
1.3、任何一個類,沒有顯示繼承任何類,默認繼承Object,那么Object類當中有
哪些方法呢?老祖宗為我們提供了哪些方法?
以后慢慢的大家一定要適應看JDK的源代碼(多看看牛人寫的程序自己才會變成牛人。)
先模仿后超越。
java為什么比較好學呢?
是因為Java內(nèi)置了一套龐大的類庫,程序員不需要從0開始寫代碼,程序員可以
基于這套龐大的類庫進行“二次”開發(fā)。(開發(fā)速度較快,因為JDK內(nèi)置的這套庫
實現(xiàn)了很多基礎的功能。)
例如:String是SUN編寫的字符串類、System是SUN編寫的系統(tǒng)類。
這些類都可以拿來直接使用。
JDK源代碼在什么位置?
C:\Program Files\Java\jdk-13.0.2\lib\src.zip
你現(xiàn)在能看懂以下代碼了嗎?
System.out.println("Hello World!");
System.out 中,out后面沒有小括號,說明out是變量名。
另外System是一個類名,直接使用類名System.out,說明out是一個靜態(tài)變量。
System.out 返回一個對象,然后采用“對象.”的方式訪問println()方法。
我們研究了一下Object類當中有很多方法,大部分看不懂,其中有一個叫做toString()
的,我們進行了測試,發(fā)現(xiàn):
System.out.println(引用);
當直接輸出一個“引用”的時候,println()方法會先自動調(diào)用“引用.toString()”,然后
輸出toString()方法的執(zhí)行結(jié)果。