Java基礎學習筆記(十一)—— 繼承

Java基礎學習筆記(十一)—— 繼承

You got a dream, you gotta protect it.

| @Author:TTODS


java中的繼承

繼承是面向對象的三大特性之一:繼承是類與類的一種關係,是一種“is a”的關係。比如“狗”繼承“動物”,這裏動物類是狗類的父類或者基類,狗類是動物類的子類或者派生類。

在java中聲明類時使用 extends關鍵字來指定父類,若沒有指明,則默認父類爲Objectjava.lang.Object類是java的根類,java中所有類都直接或間接的繼承了Object類。

我們先創建一個Animal類。然後再創建一個Animal類的子類Dog

//創建Animal類(偷個懶,其實就是之前使用過的)
package first;

public class Animal{
	String name;
	float weight;
	//默認的無參構造方法
	public Animal() {
		this.name = "暫未命名的神祕生物" ;
		this.weight = 0.0f;
	}
	//知道名字和重量
	public Animal(String n,float w) {
		this.name = n;
		this.weight = w;
	}
	//只知道重量,不知道名字
	public Animal(float w) {
		this("暫未命名的神祕生物",w);
	}
	//只知道名字,不知道重量
	public Animal(String n) {
		this(n,0.0f);
	}
	public String getName() {
		return this.name;
	}
	public float getWeight() {
		return this.weight;
	}
	public void sayHello() {
		System.out.println("Helloooo~");
	}
	}
//創建一個Animal類的子類,Dog類
package first;

public class Dog extends Animal{
	public String color;
	public Dog() {
		super();//使用父類的構造方法
		this.color =null;
	}
	public Dog(String n,float w,String cl) {
		super(n,w);//使用父類的構造方法
		this.color = cl;
	}
}

注意:我們在Dog類中只寫了一個成員變量color,再看下面代碼

package first;

public class Test{
	public static void main(String[] args) {
		Dog myDog = new Dog("小T",1.0f,"白色");
		//name,weight成員變量都來自父類(Animal類)
		System.out.printf("myDog: name:%S , weight:%.2fkg, color:%s\n",myDog.name,myDog.weight,myDog.color);
		myDog.sayHello();//sayHello方法來自父類(Animal類)
	}
}

輸出

myDog: name:小T , weight:1.00kg, color:白色
Helloooo~

從上例中可以看出,雖然我們只爲Dog類寫了一個成員變量color,但是依舊可以使用從父類中繼承的成員變量和方法

成員變量的隱藏和方法的覆蓋

當子類中存在與父類中名字一樣的成員變量時,會屏蔽父類中成員變量的名字,成爲“成員變量的隱藏”。(就不演示了,看方法的覆蓋,也能理解成員變量的隱藏)
當子類中存在與父類中只有方法體不同(返回值,方法名,參數列表都相同)的方法時,會將父類中的對應的方法覆蓋(override)。示例:
我們再Dog類中重寫sayHello方法:

package first;

public class Dog extends Animal{
	public String color;
	public Dog() {
		super();//使用父類的構造方法
		this.color =null;
	}
	public Dog(String n,float w,String cl) {
		super(n,w);//使用父類的構造方法
		this.color = cl;
	}
	//父類中已有sayHello方法,見上文
	public void sayHello() {
		System.out.println("Hello,我是一隻小狗");
	} 
}

然後再執行Test.java文件:

package first;

public class Test{
	public static void main(String[] args) {
		Dog myDog = new Dog("小T",1.0f,"白色");
		System.out.printf("myDog: name:%S , weight:%.2fkg, color:%s\n",myDog.name,myDog.weight,myDog.color);
		myDog.sayHello();
	}
}

輸出

myDog: name:小T , weight:1.00kg, color:白色
Hello,我是一隻小狗

值得注意的是,成員變量被覆蓋後我們仍可以使用super關鍵字指定調用父類的成員變量,方法:super.name;
同理也可以使用super關鍵字調用被覆蓋的父類方法:super.sayHello()

方法覆蓋時應遵循的原則
  1. 覆蓋後的方法不能比原方法有更嚴格的訪問控制。
  2. 覆蓋後的方法不能比原方法產生更多的異常。

- THE END -
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章