這篇文章帶給大家的內容是介紹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.在子類別建構方法中明確呼叫父類別有參構造方法。
存取修飾符 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.访问权限不能严于父类
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中文網其他相關文章!