Java面向物件——類的繼承
1.繼承的定義以及基本使用
定義:子類能夠繼承父類的共有屬性和方法;
特點:Java中只支援單繼承,私有方法不能被繼承;
實現繼承的類被稱為子類(也叫派生類),被繼承的類被稱為父類(也叫基類).
Java的繼承通過extends關鍵字實現.
先寫一個父類Animals類:
定義兩個私有屬性 name和age 然後給出共有的set和get介面 以及一個共有的say()方法;
package m10d28; public class Animals { private String name; private int age; 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; } public void speak(){ System.out.println("我是一隻動物,我叫"+this.getName()+",我的年齡是"+this.getAge()); } }
再寫一個子類Dog類,通過extends關鍵字 繼承Animal類:
實際上把父類Animal的共有方法get set以及say()方法都繼承了;
package m10d28;
public class Dog extends Animals{
public static void main(String[] args) {
Dog dog=new Dog();
dog.setName("dog");
dog.setAge(2);
dog.speak();
}
}
輸出結果:
我是一隻動物,我叫dog,我的年齡是2
2,方法重寫
定義:所謂方法的重寫 我們可以在子類中根據實際要求把父類的方法重寫;
package m10d28;
public class Cat extends Animals{
public void speak(){
System.out.println("我是一隻貓,我重寫了父類的方法,我叫"+this.getName()+",我的年齡是"+this.getAge());
}
public static void main(String[] args) {
Cat dog=new Cat();
dog.setName("Cat");
dog.setAge(2);
dog.speak();
}
}
注意:重寫的方法裡面的this.getName()和this.getAge()不能更改為this.name和this.age,
因為Cat物件裡繼承不到父類的私有欄位;
輸出結果:
我是一隻貓,我重寫了父類的方法,我叫Cat,我的年齡是2
3,物件例項過程以及super關鍵字
物件例項化 先例項化呼叫父類構造方法,再呼叫子類例項化構造方法;
super關鍵主要是呼叫父類方法或者屬性;
我們先來看看父類和子類的構造方法是如何呼叫的,順序是怎樣的:
我們先在父類Animals中新增父類無參構造方法和父類有參構造方法:
//新增無參構造方法
public Animals(){
System.out.println("父類無參構造方法!");
}
//新增有參構造方法
public Animals(String name, int age) {
System.out.println("父類有參構造方法!");
this.name = name;
this.age = age;
}
在子類Cat中新增子類無參構造方法:
public Cat(){
System.out.println("子類無參構造方法!");
}
輸出結果為:
父類無參構造方法!
子類無參構造方法!
我是一隻貓,我重寫了父類的方法,我叫Cat,我的年齡是2
程式是先呼叫父類的無參構造方法,再呼叫子類的無參構造方法!
super關鍵字的引用:
現在再來看看,如果在子類中用構造方法進行例項化的時候,在子類有參構造方法中
運用this.name或者this.getName()來呼叫父類私有屬性會怎樣?
由上圖可知,如果直接在子類有參構造方法中運用this.name或者this.getName()等都是會報錯的!
因為name和age在父類中都是private型別的,子類是沒有訪問許可權的!
那麼,如何在子類有參構造方法中呼叫父類的屬性和方法呢?
這時,super()關鍵字就可以派上用場了;前面說過:
super關鍵主要是呼叫父類方法或者屬性;
在Cat子類中新增有參構造方法,並且例項化:
package m10d28;
public class Cat extends Animals{
public void speak(){
System.out.println("我是一隻貓,我重寫了父類的方法,我叫"+this.getName()+",我的年齡是"+this.getAge());
}
public Cat(){
System.out.println("子類無參構造方法!");
}
public Cat(String name,int age){
super(name,age);
System.out.println("子類有參構造方法!");
}
public static void main(String[] args) {
Cat dog=new Cat("Cat",3);
dog.speak();
}
}
輸出結果:
父類有參構造方法!
子類有參構造方法!
我是一隻貓,我重寫了父類的方法,我叫Cat,我的年齡是3
這是由子類有參構造方法進行例項化的,而且用super關鍵字就可以呼叫父類私有屬性和方法!
當然,可能有人會想,我直接呼叫父類有參構造方法不就行了;
但是偶爾子類也有自己獨特的屬性,這時也需要父類的屬性一起:
package m10d28;
public class Cat extends Animals{
public Cat(){
System.out.println("子類無參構造方法!");
}
//給Cat新增一個獨特的屬性sex
private String sex;
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public Cat(String name,int age,String sex){
super(name,age);
this.sex=sex;
System.out.println("子類有參構造方法!");
}
public void speak(){
System.out.println("我是一隻貓,我重寫了父類的方法,我叫"+this.getName()+
",我的年齡是"+this.getAge()+",我的性別是"+this.sex);
}
public static void main(String[] args) {
Cat dog=new Cat("Cat",5,"雌性");
dog.speak();
}
}
輸出結果:
父類有參構造方法!
子類有參構造方法!
我是一隻貓,我重寫了父類的方法,我叫Cat,我的年齡是5,我的性別是雌性