1. 程式人生 > >JAVA基礎(52)---繼承

JAVA基礎(52)---繼承

Java是一門純粹的面向物件的程式語言

面向物件有三個基本特徵:封裝  繼承  多型

封裝:隱藏實現細節,對外提供公共的訪問方法。就是將成員變數(屬性)進行私有化,同時對外提供getter和sertter方法,方法和類 也是封裝的一種表現形式

繼承

類中:屬性、類屬性 、構造方法、構造程式碼塊、靜態程式碼塊、普通方法、靜態方法

類與類之間的關係:繼承

繼承在程式碼中的體現:extends
例子:    
            人  
                       職業:學生
                                  工人
                                  教師
                      性別:
                                男人
                                女人
                      年齡:
                               未成年人
                               成年人
通過

關鍵字 extends 來使兩個類之間產生了關係
產生了繼承的關係:
                  student 是 person 的子類/派生類/衍生類
                  person 是 student 的父類/超類           

java中繼承的特點

  1. Java中的繼承都是單繼承,不允許多繼承,但是可以允許多重繼承。也就是說:一個類只能有一個父類
  2. 一個類只能有一個父類,但是一個類可以有多個子類在繼承中,子類都可以繼承父類的哪些成員:
  • 子類可以繼承父類的非私有的成員屬性:不能是private修飾的。區分子類和父類的同名的成員屬性:super:代表父類的當前物件
  • 構造方法構造方法不能繼承,但是當我們去建立子類物件的時候,會先呼叫父類的構造方法;在子類的構造方法中,如果要呼叫父類的構造方法,對共有的屬性進行初始化那麼就可以使用super()來呼叫父類的構造方法,但是在使用的時候,必須出現在構造方法的第一句
  • 構造程式碼塊。當我們建立子類物件的時候,也會先執行父類的構造程式碼塊,再執行父類構造方法,再執行子類構造程式碼塊,子類的構造方法
  • 靜態程式碼塊。如果建立父類物件,那麼就在建立父類物件之前,執行一次父類的靜態程式碼塊,在建立子類物件的時候,靜態程式碼塊就不在執行了,如果沒有建立父類物件,那麼在建立子類物件的時候,首先會執行父類的靜態程式碼塊,而且只執行一次
  •  普通方法。方法的繼承,也是隻能繼承非私有的方法。當我們去使用子類物件去呼叫一個方法的時候,首先在子類中找,如果子類中有,則執行子類的方法,如果子類中沒有,則去父類中找,如果父類中有,則執行父類的。在同一個類中,如果方法名稱相同,則稱為過載(需要滿足過載要求);在同一個類中,如果出現在繼承的兩個類中,方法名稱相同,則稱為重寫(覆蓋):

               重寫的條件:

                               1、存在繼承關係的兩個類中

                               2、方法的宣告必須完全一致(方法的名稱和引數列表必須完全相同)

                               3、子類中的重寫父類的方法的時候,不能採用比父類更為嚴格的訪問修飾符

              方法重寫的作用:

                               對父類中的該方法進行擴充套件或者重新實現。    

  • 靜態方法。從表現形式上來說,靜態方法也能繼承,但是本質不是繼承。對於靜態方法不能進行重寫
  •  final關鍵字。可以修飾類、修飾變數、修飾方法。使用final修飾的類不能被繼承;使用final修飾的變數只能被賦值一次使用final修飾的方法不能被重寫。final的使用場景:

                    1、類不想被繼承
                    2、使用final修飾的變數的值,不想被修改。一般情況下,使用final修飾的變數稱為常量,而且常量的修飾一般是 static 和 final共同進行修飾
                    3、方法不想被重寫

繼承的好處

  1. 提高了程式碼的複用性。多個類相同的成員可以放到同一個類中
  2. 提高了程式碼的維護性。如果功能的程式碼需要修改,修改一處即可
  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();
	}
}