這篇文章帶給大家的內容是介紹Java繼承是什麼? Java繼承如何使用? ,教導新手學會使用繼承,並理解繼承的概念。掌握存取修飾符、掌握 final 關鍵字的用法。有一定的參考價值,有需要的朋友可以參考一下,希望對你們有幫助。
繼承
為什麼要使用繼承
首先我們先看一下這兩個類別:
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 類別中有一些相同的屬性和方法,這些都屬於重複程式碼,當一個程式中有大量的類別時,就會產生大量的重複程式碼。這些重複的程式碼能不能抽取然後供其他類別使用以簡化呢,那就是使用繼承。
使用繼承最佳化之後:
建立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("学习课程"); } 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) { //创建Student对象 Student stu=new Student(); stu.setName("张三");//父类中继承过来的方法 stu.learn();//子类中特有的方法 stu.sayHi(); //创建Teacher对象 Teacher teacher=new Teacher(); teacher.setName("汤尼"); teacher.setTeachingAge(2);//子类中特有的方法 teacher.sayHi(); } }
觀察上面範例程式碼我們發現:
1.子類別的公共程式碼都可以放在父類別中
2.子類別可以有自己獨有的方法和屬性
3.子類別一旦繼承父類別就會擁有父類別的屬性和方法
#4.將公用程式碼放入父類,更方便統一修改程式碼
繼承的語法
#關鍵字:extends
1.寫父類
public class 父类{ //公共的属性和方法 }
2.寫子類,繼承父類
public class 子类 extends 父类{ //子类特有的属性和方法 }
子類只能繼承一個父類
子類存取父類別成員
子類別要想存取父類別的成員要使用super
關鍵字,super
代表父類別物件
存取父類別建構方法:
super();//访问无参构造 super(参数);//访问有参构造
存取父類別屬性:
super.name;
存取父類別方法:
super.print();
存取父類別構造,必須在子類別建構方法中調用,必須是第一句
super 只能出現在子類別的方法和建構方法中
super 不能存取父類別的private 成員
敲一敲:訪問父類別成員
建立套件visitparent 後在封包下建立如下類別
父類別
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;//毛发颜色 private int age; public Cat () { super();//调用父类无参 } public Cat(String name,int legs,String hairColor,int age) { super(name, legs);//这里调用相当于重用父类构造方法了 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 成員
#子類別不能繼承不同套件使用預設存取權限的成員(預設存取權限就是不寫存取修飾符)
子類別不能繼承父類別的建構方法
#多重繼承的執行流程
在建立子類別的時候父類在做什麼?
下面建立3個類別觀察執行流程,C類繼承B類,B類繼承A類。
A.java
public class A { public A() { System.out.println("A类的无参构造函数执行"); } }
B.java
public class B extends A{ public B() { System.out.println("B类的无参构造函数执行"); } }
C.java
public class C extends B{ public C() { System.out.println("C类的无参构造函数执行"); } }
TestRunFlow.java 測試類,顯示執行結果
public class TestRunFlow { public static void main(String[] args) { C c=new C(); } }
運行結果為:
A類別的無參考建構函式執行
B類別的無參考建構子執行
C類別的無參考建構子執行
#如果子類別建構方法透過super 明確呼叫父類別對應建構方法,則不執行父類別無參構方法
子類別建構方法預設會呼叫父類別無參照構造方法
呼叫父類無參構造方法,一直到執行頂級父類Object類的的無參構造方法為止
根據上述規則,判斷下面的程式碼是否能編譯透過
父類別
public class Pet { private String name; public Pet(String name) { this.name=name; } }
子類別
public class Dog extends Pet{ }
答案是不能,父類別中只有有參構造方法沒有無參構造方法,子類別中沒有任何程式碼預設有一個隱式無參構造方法,子類別無參構造方法預設呼叫父類無參構造方法,然而父類中沒有,所有在子類中報錯。
解決方法:1.在父類別中明確新增無參構造方法,2.在子類別建構方法中明確呼叫父類別有參構造方法。
java 中的存取修飾符
存取修飾符 protected 能修飾屬性與方法,修飾後本類別、子類別、同套件可以存取。
存取修飾符 | 本類別 | #相同套件 | 子類別 | #其他 |
---|---|---|---|---|
private | √ | |||
預設(friendly) | √ | #√ |
|
|
protected | ##√√√ | #√ | ||
√ | √ | √ | #√ |
方法重写
在"继承优化后"的代码中,Teacher 继承了 People 类,(忘记代码可以翻回去再看一遍) People 类中有个一个打招呼的方法 sayHi()
用于输出人的名字,但是 Teacher 调用这个方法并不能打印出 Teacher 的属性 teachingAge
的值,但是我们还想用这个方法实现这个功能,应该怎么办呢?
我们可以使用 方法重写 解决这个问题,修改子类 Teacher 中的代码,下面看一下使用方法重写后的效果。
Teacher.java
package inherit; public class Teacher extends People{ //省略其他属性 @Override public void sayHi() { System.out.println("我是:"+super.getName()+" ,从事教育行业 "+this.teachingAge+" 年了。"); } //省略其他方法、getter、setter }
在 Eclipse 中重写某方法的快捷键是 Alt+Shift+S+V ,按完后选择要重写的方法
在 Idea 中重写某方法的快捷键是 Ctrl+O ,按完后选择要重写的方法
@Override 注解的作用, 用来检测是否符合重写规则,不符合重写规则将报错,这个注解可以不写
构造方法不能重写,因为构造方法不能被继承
方法重写的规则:
1.方法名相同
2.参数列表相同
3.返回值类型相同或者是其子类
4.访问权限不能严于父类
final 关键字的使用
1.final 修饰变量后变为常量
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 修饰创建的对象后,该对像不能再次实例化(可以修改属性)
final Teacher teacher=new Teacher(); teacher.setName("汤尼"); //teacher=new Teacher();//去掉注释试试
String 类就是一个典型的被 final 修饰的类
以上是Java繼承是什麼? Java繼承如何使用?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

javaispopularforcross-platformdesktopapplicationsduetoits“ writeonce,runany where”哲學。 1)itusesbytiesebyTecodeThatrunsonAnyJvm-備用Platform.2)librarieslikeslikeslikeswingingandjavafxhelpcreatenative-lookingenative-lookinguisis.3)

在Java中編寫平台特定代碼的原因包括訪問特定操作系統功能、與特定硬件交互和優化性能。 1)使用JNA或JNI訪問Windows註冊表;2)通過JNI與Linux特定硬件驅動程序交互;3)通過JNI使用Metal優化macOS上的遊戲性能。儘管如此,編寫平台特定代碼會影響代碼的可移植性、增加複雜性、可能帶來性能開銷和安全風險。

Java將通過雲原生應用、多平台部署和跨語言互操作進一步提昇平台獨立性。 1)雲原生應用將使用GraalVM和Quarkus提升啟動速度。 2)Java將擴展到嵌入式設備、移動設備和量子計算機。 3)通過GraalVM,Java將與Python、JavaScript等語言無縫集成,增強跨語言互操作性。

Java的強類型系統通過類型安全、統一的類型轉換和多態性確保了平台獨立性。 1)類型安全在編譯時進行類型檢查,避免運行時錯誤;2)統一的類型轉換規則在所有平台上一致;3)多態性和接口機制使代碼在不同平台上行為一致。

JNI會破壞Java的平台獨立性。 1)JNI需要特定平台的本地庫,2)本地代碼需在目標平台編譯和鏈接,3)不同版本的操作系統或JVM可能需要不同的本地庫版本,4)本地代碼可能引入安全漏洞或導致程序崩潰。

新興技術對Java的平台獨立性既有威脅也有增強。 1)雲計算和容器化技術如Docker增強了Java的平台獨立性,但需要優化以適應不同雲環境。 2)WebAssembly通過GraalVM編譯Java代碼,擴展了其平台獨立性,但需與其他語言競爭性能。

不同JVM實現都能提供平台獨立性,但表現略有不同。 1.OracleHotSpot和OpenJDKJVM在平台獨立性上表現相似,但OpenJDK可能需額外配置。 2.IBMJ9JVM在特定操作系統上表現優化。 3.GraalVM支持多語言,需額外配置。 4.AzulZingJVM需特定平台調整。

平台獨立性通過在多種操作系統上運行同一套代碼,降低開發成本和縮短開發時間。具體表現為:1.減少開發時間,只需維護一套代碼;2.降低維護成本,統一測試流程;3.快速迭代和團隊協作,簡化部署過程。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

SecLists
SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。

SublimeText3 英文版
推薦:為Win版本,支援程式碼提示!

Atom編輯器mac版下載
最受歡迎的的開源編輯器

禪工作室 13.0.1
強大的PHP整合開發環境