Java基礎學習筆記(十一)—— 繼承
You got a dream, you gotta protect it.
| @Author:TTODS
java中的繼承
繼承是面向對象的三大特性之一:繼承是類與類的一種關係,是一種“is a”的關係。比如“狗”繼承“動物”,這裏動物類是狗類的父類或者基類,狗類是動物類的子類或者派生類。
在java中聲明類時使用 extends
關鍵字來指定父類,若沒有指明,則默認父類爲Object
,java.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()
方法覆蓋時應遵循的原則
- 覆蓋後的方法不能比原方法有更嚴格的訪問控制。
- 覆蓋後的方法不能比原方法產生更多的異常。