JAVA基礎(52)---繼承
Java是一門純粹的面向物件的程式語言
面向物件有三個基本特徵:封裝 繼承 多型
封裝:隱藏實現細節,對外提供公共的訪問方法。就是將成員變數(屬性)進行私有化,同時對外提供getter和sertter方法,方法和類 也是封裝的一種表現形式
繼承
類中:屬性、類屬性 、構造方法、構造程式碼塊、靜態程式碼塊、普通方法、靜態方法
類與類之間的關係:繼承
繼承在程式碼中的體現:extends
例子:
人
職業:學生
工人
教師
性別:
男人
女人
年齡:
未成年人
成年人
通過
產生了繼承的關係:
student 是 person 的子類/派生類/衍生類
person 是 student 的父類/超類
java中繼承的特點
- Java中的繼承都是單繼承,不允許多繼承,但是可以允許多重繼承。也就是說:一個類只能有一個父類
- 一個類只能有一個父類,但是一個類可以有多個子類在繼承中,子類都可以繼承父類的哪些成員:
- 子類可以繼承父類的非私有的成員屬性:不能是private修飾的。區分子類和父類的同名的成員屬性:super:代表父類的當前物件
- 構造方法。構造方法不能繼承,但是當我們去建立子類物件的時候,會先呼叫父類的構造方法;在子類的構造方法中,如果要呼叫父類的構造方法,對共有的屬性進行初始化那麼就可以使用super()來呼叫父類的構造方法,但是在使用的時候,必須出現在構造方法的第一句
- 構造程式碼塊。當我們建立子類物件的時候,也會先執行父類的構造程式碼塊,再執行父類構造方法,再執行子類構造程式碼塊,子類的構造方法
- 靜態程式碼塊。如果建立父類物件,那麼就在建立父類物件之前,執行一次父類的靜態程式碼塊,在建立子類物件的時候,靜態程式碼塊就不在執行了,如果沒有建立父類物件,那麼在建立子類物件的時候,首先會執行父類的靜態程式碼塊,而且只執行一次
- 普通方法。方法的繼承,也是隻能繼承非私有的方法。當我們去使用子類物件去呼叫一個方法的時候,首先在子類中找,如果子類中有,則執行子類的方法,如果子類中沒有,則去父類中找,如果父類中有,則執行父類的。在同一個類中,如果方法名稱相同,則稱為過載(需要滿足過載要求);在同一個類中,如果出現在繼承的兩個類中,方法名稱相同,則稱為重寫(覆蓋):
重寫的條件:
1、存在繼承關係的兩個類中
2、方法的宣告必須完全一致(方法的名稱和引數列表必須完全相同)
3、子類中的重寫父類的方法的時候,不能採用比父類更為嚴格的訪問修飾符
方法重寫的作用:
對父類中的該方法進行擴充套件或者重新實現。
- 靜態方法。從表現形式上來說,靜態方法也能繼承,但是本質不是繼承。對於靜態方法不能進行重寫
- final關鍵字。可以修飾類、修飾變數、修飾方法。使用final修飾的類不能被繼承;使用final修飾的變數只能被賦值一次使用final修飾的方法不能被重寫。final的使用場景:
1、類不想被繼承
2、使用final修飾的變數的值,不想被修改。一般情況下,使用final修飾的變數稱為常量,而且常量的修飾一般是 static 和 final共同進行修飾
3、方法不想被重寫
繼承的好處
- 提高了程式碼的複用性。多個類相同的成員可以放到同一個類中
- 提高了程式碼的維護性。如果功能的程式碼需要修改,修改一處即可
- 讓類與類之間產生了關係,是多型的前提。其實這也是繼承的一個弊端:類的耦合性很強。
子類是父類的擴充套件,不是簡單的複製
package org.lanqiao.extenddemo2;
public class Animal {
public String name = "小強";
protected int age;
int leg;
public Animal() {
System.out.println("父類的構造方法");
}
public Animal(String name, int age,int leg) {
this.name = name;
this.age = age;
this.leg = leg;
}
{
System.out.println("父類的構造程式碼塊");
}
static{
System.out.println("父類的靜態程式碼塊");
}
public void showInfo() {
System.out.println(this.name +"--"+this.age+"--"+this.leg);
}
public final void show() {
System.out.println("父類的普通方法....");
}
public static void print1() {
System.out.println("父類的靜態方法");
}
}
package org.lanqiao.extenddemo2;
public class LandAnimal extends Animal {
public String name ="旺財";
public int speed;
public LandAnimal() {
System.out.println("子類的構造方法");
}
public LandAnimal(int speed) {
this.speed = 20;
}
public LandAnimal(String name, int age,int leg) {
this.name = name;
this.age = age;
this.leg = leg;
}
public LandAnimal(String name , int age, int leg,int speed) {
//this(name,age,leg);
super(name,age,leg);
this.speed = speed;
}
{
System.out.println("子類的構造程式碼塊");
}
static{
System.out.println("子類的靜態程式碼塊");
}
public void printInfo() {
System.out.println(super.name +"--"+age+"--"+leg);
}
@Override
public void show() {
System.out.println("子類的普通方法");
}
@Override
public String toString() {
return "LandAnimal [name=" + name + ", speed=" + speed + "]";
}
public static void print1() {
System.out.println("子類的靜態方法");
}
}
測試程式碼
package org.lanqiao.extenddemo2;
public class Test {
public static void main(String[] args) {
/*Animal a = new Animal();
a.showInfo();*/
System.out.println("--------------------");
LandAnimal la = new LandAnimal();
la.printInfo();
LandAnimal la1 = new LandAnimal();
la1.show();
System.out.println(la1.toString());
LandAnimal.print1();
}
}