<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
繼承是物件導向語法的三大特徵之一。繼承可以降低程式碼編寫的冗餘度,提高程式設計的效率。通過繼承,子類獲得了父類別的成員變數和方法。一個子類如何繼承父類別的欄位和方法,如何修改從父類別繼承過來的子類的方法呢。今天我們開始學習有關Java繼承的知識。
繼承就是子類繼承父類別的特徵和行為,使得子類物件(範例)具有父類別的範例域和方法,或子類從父類別繼承方法,使得子類具有父類別相同的行為。
繼承的作用:通過繼承可以快速建立新的類,實現程式碼的重用,提高程式的可維護性,節省大量建立新類的時間,提高開發效率和開發質量。
在 Java 中通過 extends 關鍵字可以申明一個類是從另外一個類繼承而來的,一般形式如下:
class 父類別{
... //成員變數、成員方法
}
class 子類 extends 父類別{
... //類體
}
例如:
class teacher{ //宣告一個teacher類為父類別 String name; //定義父類別的成員變數name、age int age; void show(){ //定義父類別成員方法,將成員變數輸出 System.out.println(name); System.out.println(age); } } class Student extends teacher { //宣告一個Student類為子類並繼承父類別 } public class myfirst { public static void main(String[] args) { System.out.println("學生"); Student student=new Student(); //宣告一個Student類的範例物件student student.name="Tom"; //子類呼叫父類別的成員變數name並賦值 student.age=19; //子類呼叫父類別的成員變數age並賦值 student.show(); //子類呼叫父類別的成員方法show } }
執行結果為:
學生
Tom
19
注意:
子類繼承了父類別中的所有成員及方法,但在某種情況下,子類中該方法所表示的行為與其父類別中該方法所表示的行為不完全相同,例如,在父類別語言中定義了說話這個方法,而在子類中說話的方法是不同的:外國人說英文,中國人說中文,這時我們就需要重寫或隱藏父類別的該方法。
當一個子類中一個實體方法具有與其父類別中的一個實體方法相同的簽名(指名稱、引數個數和型別)和返回值時,稱子類中的方法“重寫”了父類別的方法。例如:
class A{ public void sayHello() { //輸出英文歡迎 System.out.println("Hello,Welcome to Java!!!"); } public void sayBye() { System.out.println("GoodBye,everyone"); } } class B extends A { public void sayHello() { //輸出中文歡迎 System.out.println("大家好,歡迎學習Java!!!"); } } public class myfirst { public static void main(String[] args) { B b=new B(); //建立子類B的一個範例物件,使用預設構造方法 b.sayHello(); //呼叫子類中重寫的方法 b.sayBye(); //呼叫父類別中的方法 } }
執行結果為:
大家好,歡迎學習Java!!!
GoodBye,everyone
注意:重寫的方法具有與其所重寫的方法相同的名稱、引數數量、型別和返回值。
如果一個子類定義了一個靜態類方法,而這個類方法與其父類別的一個類方法具有相同的簽名(指名稱、引數格式和型別)和返回值,則稱在子類中的這個類方法“隱藏”了父類別中的該類方法。
class A{ public static void sayHello() { //靜態類方法 System.out.println("大家好,這是A的靜態類方法"); } public void sayHello2() { //實體方法 System.out.println("大家好,這是A中的實體方法"); } } class B extends A { public static void sayHello() { //靜態類方法 System.out.println("大家好,這是B的靜態類方法"); } public void sayHello2() { //實體方法 System.out.println("大家好,這是B的實體方法"); } } public class myfirst { public static void main(String[] args) { B b=new B(); //建立B類的範例物件b A a=b; //隱式物件型別轉換 A.sayHello(); //呼叫A類的靜態類方法 a.sayHello(); //呼叫a物件的靜態類方法 B.sayHello(); //呼叫B類的靜態方法 a.sayHello2(); //呼叫a物件的實體方法 b.sayHello2(); //呼叫b物件的的實體方法 A a2=new A(); //建立A類的範例物件a2 a2.sayHello2(); //呼叫a2物件的實現方法 } }
執行結果為:
大家好,這是A的靜態類方法
大家好,這是A的靜態類方法
大家好,這是B的靜態類方法
大家好,這是B的實體方法
大家好,這是B的實體方法
大家好,這是A中的實體方法
可以看出,得到呼叫的隱藏方法是父類別中的方法,而得到呼叫的重寫方法是子類中的方法。
在子類中被重寫的方法,其存取許可權允許大於但不允許小於被其重寫的方法,例如:父類別中一個受保護的實體方法(protected)在子類中可以是公共的(public)的,但不可以是私有的(private)。如果一個方法在父類別中是static方法,那麼在子類也必須是static方法;如果一個方法在父類別中是實體方法,那麼在子類中也必須是實體方法。
子類繼承其父類別的所有public和protected成員,但不能繼承其父類別的private成員。那麼如何在子類中存取到父類別中的欄位呢,我們可以在父類別中提供用來存取其私有欄位的public或protected方法,子類使用這些方法來存取相應的欄位。例如:
class A{ //父類別A private int value=10; //宣告一個私有變數value並賦值為10 public int getvalue() { //宣告一個公有成員方法getvalue,返回value return value; } } class B extends A{ //A的子類B } public class myfirst { public static void main(String[] args) { B b=new B(); //建立子類B的一個範例物件 System.out.println("子類通過父類別提供的公共介面存取A中的私有欄位value:"+b.getvalue()); } }
執行結果為:
子類通過父類別提供的公共介面存取A中的私有欄位value:10
使用super呼叫父類別中重寫的方法、存取父類別中被隱藏的欄位
子類重寫了父類別中的某一個方法,隱藏父類別中的欄位,假如想在子類中存取到父類別中被重寫的方法和隱藏父類別的欄位,可以在子類中通過使用關鍵字super來呼叫父類別中被重寫的方法和存取父類別中被隱藏的欄位。例如:
package first; class A{ public String name="張飛"; //新增成員變數 public void say() { //新增成員方法say System.out.println("我是父類別A成員方法say"); } } class B extends A{ public String name="關羽"; //與父類別中同名的欄位,隱藏父類別 public void say(){ //重寫方法say super.say(); //使用super關鍵字呼叫父類別中的方法 System.out.println("我是子類B成員方法say"); System.out.println("父類別的name名字:"+super.name); //使用super關鍵字存取父類別中的變數 } } public class myfirst { public static void main(String[] args) { B b=new B(); //建立子類的一個範例物件 b.say(); //呼叫子類中重寫的方法 System.out.println("子類的name名字:"+b.name); //呼叫子類中的name } }
執行結果為:
我是父類別A成員方法say
我是子類B成員方法say
父類別的name名字:張飛
子類的name名字:關羽
子類不繼承其父類別的構造方法。
例如:
class SuperClass { //建立父類別SuperClass private int n; //宣告一個私有變數n SuperClass(){ //父類別無引數構造方法 System.out.println("這是父類別SuperClass無引數構造方法"); } SuperClass(int n) { //父類別有引數構造方法 System.out.println("這是父類別SuperClass有引數構造方法"); this.n = n; } } class SubClass extends SuperClass{ // SubClass類繼承SuperClass類 private int n; //宣告一個私有變數n SubClass(){ // 自動呼叫父類別的無引數構造器 System.out.println("這是子類無引數構造方法"); } public SubClass(int n){ //子類有引數構造方法 super(300); //呼叫父類別中帶有引數的構造器 System.out.println("這是子類有引數構造方法"+n); this.n = n; } } public class myfirst { public static void main(String[] args) { SubClass sc1 = new SubClass(); //建立子類SubClass範例物件,呼叫其無引數構造方法 SubClass sc2 = new SubClass(100); //建立子類SubClass範例物件,呼叫其有引數構造方法 } }
執行結果為:
這是父類別SuperClass無引數構造方法
這是子類無引數構造方法
這是父類別SuperClass有引數構造方法
這是子類有引數構造方法100
注意
1、繼承是怎麼實現的?
使用extends 和 implements 關鍵字
extends 繼承的都是物件
implements 繼承實現並實現的是介面
2、在繼承的場景下,同一樣東西,怎麼區分是你老爹的還是你自己的?
使用super 與 this 關鍵字
super關鍵字:我們可以通過super關鍵字來實現對父類別成員的存取,用來參照當前物件的父類別。
this關鍵字:指向自己的參照。
3、父類別的某些方法不想被子類繼承,怎麼處理?
對方法或屬性進行 private 關鍵字或final關鍵字修飾
private 關鍵字修飾,子類無法使用和繼承
final關鍵字修飾,無法繼承,但是否可以被使用需要看許可權屬性
到此這篇關於Java繼承的文章就介紹到這了,更多相關Java繼承介紹內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45