JAVA面向?qū)ο笾^承?super入門解析
1 繼承
1.1概念
繼承是面向?qū)ο笞铒@著的一個(gè)特征 繼承是從已有的類中派生出新的類,新類能吸收已有類的數(shù)據(jù)屬性和行為,并擴(kuò)展新的能力. Java繼承是會(huì)用已存在的類的定義作為基礎(chǔ)建立新類的技術(shù) 新類的定義可以增加新的數(shù)據(jù)或者新的功能,也可以使用父類的功能,但不能選擇性的繼承父類(超類/基類) 這種繼承使得復(fù)用以前的代碼非常容易,能夠大大的縮短開發(fā)的周期,降低開發(fā)費(fèi)用.
1.2 特點(diǎn)
- 使用extends關(guān)鍵字來表示繼承關(guān)系
- 相當(dāng)于子類把父類的功能復(fù)制了一份
- Java只支持單繼承
- 繼承可以傳遞(爺爺/兒子/孫子這樣的關(guān)系)
- 父類的私有成員由于私有限制訪問,所以子類不能使用父類的私有資源
- 繼承多用于功能的修改,子類可以在擁有父類功能的同時(shí),進(jìn)行功能拓展
- 像是is a的關(guān)系
1.3 練習(xí):繼承入門案例
創(chuàng)建包: cn.tedu.oop2
創(chuàng)建類: TestExtends.java
package cn.tedu.oop2; /*本類用于繼承的入門案例*/ public class TestExtends { public static void main(String[] args) { //5.分別創(chuàng)建3個(gè)類的對象 Animal a = new Animal(); Cat c = new Cat(); MiaoMiao m = new MiaoMiao(); //6.利用對象調(diào)用方法進(jìn)行測試 /*3.繼承相當(dāng)于是子類將父類的功能復(fù)制了一份 繼承還具有傳遞性,爺爺?shù)墓δ軙?huì)傳給爸爸,爸爸的功能會(huì)傳給孫子*/ a.eat();//爺爺類使用自己的方法 c.eat();//爸爸類可以使用從爺爺類中繼承過來的方法 m.eat();//孫子類也可以使用從爺爺類中繼承過來的方法 } } /*1.我們通過extends關(guān)鍵字建立子類與父類的繼承關(guān)系,格式:子類 extends 父類*/ /*2.Java只支持單繼承,一個(gè)子類只能有一個(gè)父類,但是一個(gè)父類可以有多個(gè)子類*/ //1.創(chuàng)建小動(dòng)物類--爺爺類 class Animal{ //4.添加爺爺類的普通方法 public void eat(){ System.out.println("小動(dòng)物Animal吃啥都行~"); } } //2.創(chuàng)建小貓類--爸爸類 /*6.繼承是is a的關(guān)系,比如小貓是小動(dòng)物,MiaoMiao是一只小貓 * 繼承要求子類必須是父類的一種下屬類型,依賴性非常強(qiáng),強(qiáng)耦合*/ class Cat extends Animal{ //7.定義爸爸類中的屬性 int a = 10;//普通屬性 private int b = 100;//私有屬性 } //3.創(chuàng)建MiaoMiao類--孫子類 class MiaoMiao extends Cat{ /*4.子類可以擁有自己獨(dú)有的方法,實(shí)現(xiàn)了功能的拓展,青出于藍(lán)而勝于藍(lán)*/ //8.定義孫子類的方法 public void studyJava(){ System.out.println("正在學(xué)Java"); System.out.println(a); /*5.子類繼承了父類以后,可以使用父類的所有非私有資源 * 注意:這個(gè)私有資源由于被private修飾,所以沒有訪問權(quán)限*/ //System.out.println(b);//不可以,私有資源被限制訪問 } }
2 super
我們可以把super看作是父類的對象:Father super = new Father();
1.當(dāng)父類的成員變量與子類的變量同名時(shí),使用super指定父類的成員變量
2.使用super在子類構(gòu)造方法的第一行調(diào)用父類構(gòu)造方法的功能
super();–調(diào)用的是父類的無參構(gòu)造
super(參數(shù));–調(diào)用的是父類對應(yīng)參數(shù)的構(gòu)造方法
注意:在構(gòu)造方法里,出現(xiàn)的調(diào)用位置必須是第一行
3 繼承的用法
3.1 練習(xí):super之繼承中成員變量使用
創(chuàng)建包: cn.tedu.oopextends
創(chuàng)建類: TestExtends1.java
package cn.tedu.oop2; /*本類用于測試?yán)^承中變量的使用*/ public class ExtendsDemo1 { public static void main(String[] args) { //7.創(chuàng)建子類的匿名對象,調(diào)用study() new Son().study(); } } //1.創(chuàng)建父類 class Father{ //3.創(chuàng)建父類的成員變量 int sum = 1; int count = 2; } //2.創(chuàng)建子類 class Son extends Father{ //4.創(chuàng)建子類的成員變量 int sum = 10; //5.創(chuàng)建子類的普通方法 public void study(){ System.out.println("goog good study , day day up"); //6.創(chuàng)建子類的局部變量 int sum = 100; //8.打印子類的局部變量sum System.out.println(sum);//100 //9.打印子類的成員變量sum System.out.println(this.sum);//10 //10.打印父類的成員變量sum /*當(dāng)父類的成員變量與子類的成員變量同名時(shí),可以使用super指定父類的成員變量 * 我們可以把super看作是父類的對象:Father super = new Father();*/ System.out.println(super.sum);//1 System.out.println(count); } }
3.2 練習(xí):super之繼承中構(gòu)造方法的使用
創(chuàng)建包: cn.tedu.oop2
創(chuàng)建類: ExtendsDemo2.java
package cn.tedu.oop2; /*本類用于測試?yán)^承中構(gòu)造方法的使用 * 1.子類在創(chuàng)建對象時(shí),默認(rèn)會(huì)先調(diào)用父類的構(gòu)造方法 * 2.原因是子類構(gòu)造函數(shù)中的第一行默認(rèn)存在super();--表示調(diào)用父類的無參構(gòu)造 * 3.當(dāng)父類沒有無參構(gòu)造時(shí),可以通過super(參數(shù))調(diào)用父類的其他含參構(gòu)造 * 子類必須調(diào)用一個(gè)父類的構(gòu)造函數(shù),不管是無參還是含參,選一個(gè)即可 * 4.構(gòu)造方法不可以被繼承!因?yàn)檎Z法的原因:要求構(gòu)造方法的名字必須是本類類名 * 不能在子類中出現(xiàn)一個(gè)父類名字的構(gòu)造方法*/ public class ExtendsDemo2 { public static void main(String[] args) { //6.1通過父類的無參構(gòu)造創(chuàng)建父類對象 //Father2 f = new Father2(); //6.2通過父類的含參構(gòu)造創(chuàng)建父類對象 //Father2 f2 = new Father2("哈哈哈"); //7.創(chuàng)建子類對象 Son2 s = new Son2(); } } //1.創(chuàng)建父類 class Father2{ //3.創(chuàng)建父類的無參構(gòu)造 // public Father2(){ // System.out.println("我是父類的無參構(gòu)造"); // } //4.創(chuàng)建父類的含參構(gòu)造 public Father2(String s){ System.out.println("我是父類的含參構(gòu)造"+s); } } //2.創(chuàng)建子類 class Son2 extends Father2{ //5.創(chuàng)建子類的無參構(gòu)造 public Son2(){ //super();//調(diào)用父類的無參構(gòu)造 super("你好~"); System.out.println("我是子類的無參構(gòu)造"); } }
4 方法重寫Override
繼承以后,子類就擁有了父類的功能
在子類中,可以添加子類特有的功能,也可以修改父類的原有功能
子類中方法的簽名與父類完全一樣時(shí),會(huì)發(fā)生覆蓋/復(fù)寫的現(xiàn)象
注意: 父類的私有方法不能被重寫
重寫的要求:兩同兩小一大
兩同:方法名 參數(shù)列表 要完全一致
兩小:
子類返回值類型小于等于父類的返回值類型(注意此處說的是繼承關(guān)系,不是值大小)
子類拋出異常小于等于父類方法拋出異常
一大:子類方法的修飾符權(quán)限要大于等于父類被重寫方法的修飾符權(quán)限
4.1 練習(xí):繼承中成員方法的使用
創(chuàng)建包: cn.tedu.oop2
創(chuàng)建類: ExtendsDemo3.java
package cn.tedu.oop2; /*本類用于測試?yán)^承中方法的使用*/ public class ExtendsDemo3 { public static void main(String[] args) { //4.創(chuàng)建對象進(jìn)行測試 Father f = new Father(); Son s = new Son(); f.eat(); s.eat(); f.play(); s.play(); } } //1.創(chuàng)建父類 class Father{ //3.定義父類中的普通方法 public void eat(){ System.out.println("爸爸愛吃肉"); } public void play(){ System.out.println("爸爸愛放風(fēng)箏"); } } //2.創(chuàng)建子類 class Son extends Father{ //5.如果子類對父類的方法不滿意,可以重寫父類的方法 /*重寫的原則:兩同 兩小 一大 * 兩同:子類方法的 方法名與參數(shù)列表 和父類方法的相同 * 一大:子類方法的 方法修飾符權(quán)限 >= 父類方法的 * 兩小:子類方法的返回值類型 <= 父類方法的返回值類型 * 注意:這里所說的<=是指子類方法的返回值類型是父類返回值類型的子類 * 或者與父類的返回值類型一致,如果父類方法的返回值類型是void,子類保持一致即可 * */ @Override //注解,用來加在方法上,表示這是一個(gè)重寫的方法 public void eat(){ System.out.println("兒子愛吃蔬菜"); } @Override public void play(){ System.out.println("兒子愛玩游戲"); } }
5 拓展
5.1 繼承的好處與壞處
繼承的好處
提高了代碼的復(fù)用性(多個(gè)類相同的成員可以放在同一個(gè)類中)
提高了代碼的維護(hù)性(如果方法的代碼需要修改,只修改一處即可)
繼承的壞處
繼承讓類與類建立了關(guān)系,類的耦合性增強(qiáng)
當(dāng)父類發(fā)生變化時(shí),子類實(shí)現(xiàn)也不得不跟著變化,削弱了子類的獨(dú)立性
5.2 this與super的區(qū)別
this: 代表本類對象的引用
我們可以把this看作是Cat this = new Cat();
super:代表父類存儲(chǔ)空間的標(biāo)識,可以理解成父類對象的引用
可以把super看作是Father super = new Father();
this關(guān)鍵字指向調(diào)用該方法的對象
一般我們是在當(dāng)前類中使用this關(guān)鍵字
所以我們常說this代表本類對象的引用
注意:super的使用前提是繼承,沒有父子類關(guān)系,就沒有super
注意:this調(diào)用構(gòu)造方法或者super調(diào)用構(gòu)造方法,都必須出現(xiàn)在構(gòu)造方法的第一行
注意:如果父類沒有無參構(gòu)造,需要手動(dòng)在子類構(gòu)造方法的第一行調(diào)用其他的含參構(gòu)造
拓展:如果子類重寫了父類的方法以后,可以使用super.方法名(參數(shù)列表)來調(diào)用
5.3 重載Overload與重寫Override的區(qū)別
重載:在一個(gè)類中的現(xiàn)象:同一個(gè)類中,存在方法名相同,參數(shù)列表不同的方法
重寫:是指建立了繼承關(guān)系以后,子類對父類的方法不滿意,可以重寫,遵循兩同兩小一大原則
重載的意義:是為了外界調(diào)用方法時(shí)方便,不管傳入什么樣的參數(shù),都可以匹配到對應(yīng)的同名方法
重寫的意義:在不修改源碼的情況下,進(jìn)行功能的修改與拓展(OCP原則:面向修改關(guān)閉,面向拓展開放)
到此這篇關(guān)于JAVA面向?qū)ο笾^承 super入門解析的文章就介紹到這了,更多相關(guān)JAVA 繼承 super內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
java中Memcached的使用實(shí)例(包括與Spring整合)
這篇文章主要介紹了java中Memcached的使用實(shí)例(包括與Spring整合),具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-07-07JavaSE面試題之this與super關(guān)鍵字的區(qū)別詳解
this關(guān)鍵字用于引用當(dāng)前對象的引用,super關(guān)鍵字用于引用父類對象的引用,下面這篇文章主要給大家介紹了關(guān)于JavaSE面試題之this與super關(guān)鍵字區(qū)別的相關(guān)資料,需要的朋友可以參考下2023-12-12IDEA連接Mysql數(shù)據(jù)庫的詳細(xì)圖文教程
項(xiàng)目開發(fā)時(shí)使用Intellij IDEA連接本地?cái)?shù)據(jù)庫,將數(shù)據(jù)庫可視化,還可對數(shù)據(jù)庫表直接進(jìn)行增刪改查操作,方便快捷又清晰,下面這篇文章主要給大家介紹了關(guān)于IDEA連接Mysql數(shù)據(jù)庫的詳細(xì)圖文教程,需要的朋友可以參考下2023-03-03Java中基于推、拉模式的sentinel規(guī)則持久化詳解
這篇文章主要介紹了Java中基于推、拉模式的sentinel規(guī)則持久化詳解,推模式是sentinelDashboard?把規(guī)則推給Nacos,Nacos監(jiān)聽規(guī)則的變化推給微服務(wù),拉模式是sentinelDashboard?把規(guī)則直接給微服務(wù),?Nacos定時(shí)的同步微服務(wù)端的規(guī)則,需要的朋友可以參考下2023-09-09Java 實(shí)戰(zhàn)項(xiàng)目錘煉之嘟嘟健身房管理系統(tǒng)的實(shí)現(xiàn)流程
讀萬卷書不如行萬里路,只學(xué)書上的理論是遠(yuǎn)遠(yuǎn)不夠的,只有在實(shí)戰(zhàn)中才能獲得能力的提升,本篇文章手把手帶你用java+SSM+jsp+mysql+maven實(shí)現(xiàn)一個(gè)健身房管理系統(tǒng),大家可以在過程中查缺補(bǔ)漏,提升水平2021-11-11Spring AOP 自定義注解的實(shí)現(xiàn)代碼
本篇文章主要介紹了Spring AOP 自定義注解的實(shí)現(xiàn)代碼,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-04-04