您好,登錄后才能下訂單哦!
這篇文章將為大家詳細(xì)講解有關(guān)Java繼承是什么及使用方法,文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個(gè)參考,希望大家閱讀完這篇文章后對(duì)相關(guān)知識(shí)有一定的了解。
首先我們先看一下這兩個(gè)類:
public class Teacher { private int teachingAge; private String name; private int age; public void teach() { } public void seyHi() { System.out.println("我是:"+this.name); } }
public class Student { private int studentNo; private String name; private int age; public void learn() { } public void seyHi() { System.out.println("我是:"+this.name); } }
Student 類和 Teacher 類中有一些相同的屬性和方法,這些都屬于重復(fù)代碼,當(dāng)一個(gè)程序中有大量的類時(shí),就會(huì)產(chǎn)生大量的重復(fù)代碼。這些重復(fù)的代碼能不能抽取出來然后供其他類使用以簡化呢,那就是使用繼承。
使用繼承優(yōu)化之后:
創(chuàng)建 inherit 包
父類:(公共代碼類)
package inherit; public class People { private String name; private int age; public void sayHi() { System.out.println("我是:"+this.name); } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } }
子類:Student.java
package inherit; public class Student extends People{ private int studentNo; public void learn() { System.out.println("學(xué)習(xí)課程"); } public int getStudentNo() { return studentNo; } public void setStudentNo(int studentNo) { this.studentNo = studentNo; } }
子類:Teacher.java
package inherit; public class Teacher extends People{ private int teachingAge; public void teach() { System.out.println("教授課程"); } public int getTeachingAge() { return teachingAge; } public void setTeachingAge(int teachingAge) { this.teachingAge = teachingAge; } }
測試類:
package inherit; public class TestInherit { public static void main(String[] args) { //創(chuàng)建Student對(duì)象 Student stu=new Student(); stu.setName("張三");//父類中繼承過來的方法 stu.learn();//子類中特有的方法 stu.sayHi(); //創(chuàng)建Teacher對(duì)象 Teacher teacher=new Teacher(); teacher.setName("湯尼"); teacher.setTeachingAge(2);//子類中特有的方法 teacher.sayHi(); } }
觀察上面示例代碼我們發(fā)現(xiàn):
1.子類的公共代碼都可以放在父類中
2.子類可以有自己獨(dú)有的方法和屬性
3.子類一旦繼承父類就會(huì)擁有父類的屬性和方法
4.將公共代碼放入父類,更方便統(tǒng)一修改代碼
關(guān)鍵字:extends
1.編寫父類
public class 父類{ //公共的屬性和方法 }
2.編寫子類,繼承父類
public class 子類 extends 父類{ //子類特有的屬性和方法 }
子類只能繼承一個(gè)父類
子類要想訪問父類的成員要使用 super
關(guān)鍵字,super
代表父類對(duì)象
訪問父類構(gòu)造方法:
super();//訪問無參構(gòu)造 super(參數(shù));//訪問有參構(gòu)造
訪問父類屬性:
super.name;
訪問父類方法:
super.print();
訪問父類構(gòu)造,必須在子類構(gòu)造方法中調(diào)用,必須是第一句
super 只能出現(xiàn)在子類的方法和構(gòu)造方法中
super 不能訪問父類的 private 成員
敲一敲:訪問父類成員
創(chuàng)建包 visitparent 后在報(bào)下創(chuàng)建如下類
父類
package visitparent; public class Animal { private String name; private int legs; public Animal() { this.name="無名"; this.legs=4; } public Animal(String name,int legs) { this.name=name; this.legs=legs; } public void eat(String food) { System.out.println(name+" 吃食物:"+food); } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getLegs() { return legs; } public void setLegs(int legs) { this.legs = legs; } }
子類
package visitparent; public class Cat extends Animal{ private String hairColor;//毛發(fā)顏色 private int age; public Cat () { super();//調(diào)用父類無參 } public Cat(String name,int legs,String hairColor,int age) { super(name, legs);//這里調(diào)用相當(dāng)于重用父類構(gòu)造方法了 this.hairColor=hairColor; this.age=age; //super(name, legs);//去掉注釋試試 //this.name="無名";//去掉注釋試試 } public void catchMouse() { System.out.println(super.getName()+":抓老鼠"); } public void paly() { System.out.println(super.getName()+" 玩累了。"); super.eat("小魚干"); } public String getHairColor() { return hairColor; } public void setHairColor(String hairColor) { this.hairColor = hairColor; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } }
子類不能繼承父類的 private 成員
子類不能繼承不同包使用默認(rèn)訪問權(quán)限的成員(默認(rèn)訪問權(quán)限就是不寫訪問修飾符)
子類不能繼承父類的構(gòu)造方法
在創(chuàng)建子類的時(shí)候父類在做什么?
下面創(chuàng)建3個(gè)類觀察執(zhí)行流程,C類繼承B類,B類繼承A類。
A.java
public class A { public A() { System.out.println("A類的無參構(gòu)造函數(shù)執(zhí)行"); } }
B.java
public class B extends A{ public B() { System.out.println("B類的無參構(gòu)造函數(shù)執(zhí)行"); } }
C.java
public class C extends B{ public C() { System.out.println("C類的無參構(gòu)造函數(shù)執(zhí)行"); } }
TestRunFlow.java 測試類,展示運(yùn)行結(jié)果
public class TestRunFlow { public static void main(String[] args) { C c=new C(); } }
運(yùn)行結(jié)果為:
A類的無參構(gòu)造函數(shù)執(zhí)行
B類的無參構(gòu)造函數(shù)執(zhí)行
C類的無參構(gòu)造函數(shù)執(zhí)行
如果子類構(gòu)造方法通過 super 顯式調(diào)用父類相應(yīng)構(gòu)造方法,則不執(zhí)行父類無參構(gòu)造方法
子類構(gòu)造方法默認(rèn)會(huì)調(diào)用父類無參構(gòu)造方法
調(diào)用父類無參構(gòu)造方法,一直到執(zhí)行頂級(jí)父類Object類的的無參構(gòu)造方法為止
根據(jù)以上規(guī)則,判斷下面的代碼是否能編譯通過
父類
public class Pet { private String name; public Pet(String name) { this.name=name; } }
子類
public class Dog extends Pet{ }
答案是不能,父類中只有有參構(gòu)造方法沒有無參構(gòu)造方法,子類中沒有任何代碼默認(rèn)有一個(gè)隱式無參構(gòu)造方法,子類無參構(gòu)造方法默認(rèn)調(diào)用父類無參構(gòu)造方法,然而父類中沒有,所有在子類中報(bào)錯(cuò)。
解決辦法:1.在父類中顯式添加無參構(gòu)造方法,2.在子類構(gòu)造方法中顯式調(diào)用父類有參構(gòu)造方法。
訪問修飾符 protected 能修飾屬性和方法,修飾后本類、子類、同包可以訪問。
訪問修飾符 | 本類 | 同包 | 子類 | 其他 |
---|---|---|---|---|
private | √ | |||
默認(rèn)(friendly) | √ | √ | ||
protected | √ | √ | √ | |
public | √ | √ | √ | √ |
在"繼承優(yōu)化后"的代碼中,Teacher 繼承了 People 類,(忘記代碼可以翻回去再看一遍) People 類中有個(gè)一個(gè)打招呼的方法 sayHi()
用于輸出人的名字,但是 Teacher 調(diào)用這個(gè)方法并不能打印出 Teacher 的屬性 teachingAge
的值,但是我們還想用這個(gè)方法實(shí)現(xiàn)這個(gè)功能,應(yīng)該怎么辦呢?
我們可以使用 方法重寫 解決這個(gè)問題,修改子類 Teacher 中的代碼,下面看一下使用方法重寫后的效果。
Teacher.java
package inherit; public class Teacher extends People{ //省略其他屬性 @Override public void sayHi() { System.out.println("我是:"+super.getName()+" ,從事教育行業(yè) "+this.teachingAge+" 年了。"); } //省略其他方法、getter、setter }
在 Eclipse 中重寫某方法的快捷鍵是 Alt+Shift+S+V ,按完后選擇要重寫的方法
在 Idea 中重寫某方法的快捷鍵是 Ctrl+O ,按完后選擇要重寫的方法
@Override 注解的作用, 用來檢測是否符合重寫規(guī)則,不符合重寫規(guī)則將報(bào)錯(cuò),這個(gè)注解可以不寫
構(gòu)造方法不能重寫,因?yàn)闃?gòu)造方法不能被繼承
方法重寫的規(guī)則:
1.方法名相同
2.參數(shù)列表相同
3.返回值類型相同或者是其子類
4.訪問權(quán)限不能嚴(yán)于父類
1.final 修飾變量后變?yōu)槌A?/p>
private static final long serialVersionUID = -6849794470754667710L;
2.final 修飾類后,該類不能被繼承
package java.lang; public final class Math { //省略屬性和方法…… }
3.final 修飾方法后,該方法不能被重寫
public final void teach() { System.out.println("教授課程"); }
4.final 修飾創(chuàng)建的對(duì)象后,該對(duì)像不能再次實(shí)例化(可以修改屬性)
final Teacher teacher=new Teacher(); teacher.setName("湯尼"); //teacher=new Teacher();//去掉注釋試試
String 類就是一個(gè)典型的被 final 修飾的類
關(guān)于Java繼承是什么及使用方法就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。