Java繼承(一)
1、繼承最明顯的一個特徵是“is-a”關係,什麼什麼是什麼,比如經理是員工,員工是超類,經理是子類,用extends關鍵字表示
2、在設計繼承關係的時候,通常把最一般的方法和變數放在超類中,比較特殊的方法和變數放在子類中,這是一種面向物件的程式設計思維
3、比如說現在有兩個類Employee員工類,Manager經理類
public class Employee { private String name; private double salary; private LocalDate hireDay; public Employee(String name,doublesalary,int year,int month,int day){ this.name = name; this.salary = salary; hireDay = LocalDate.of(year,month,day); } public String getName() { return name; } public double getSalary() { return salary; } public LocalDate getHireDay() {return hireDay; } public void raiseSalary(double byPercent){ double raise = salary * byPercent / 100; salary += raise; } }
public class Manager extends Employee {
private double bonus;
public void setBonus(double bonus) {
this.bonus = bonus;
}
public double getBonus() {
return bonus;
}
public Manager(String name,double salary,int year,int month,int day){
super(name,salary,year,month,day);
bonus = 0;
}
@Override
public double getSalary() {
return super.getSalary() + bonus;
}
}
通過用extends繼承關鍵詞,Manager類除了自身的bonus屬性外,還可以得到name、salary、hireDay三個屬性,所以子類比超類擁有的功能更多
4、但是有時候超類的某些方法繼承到子類中的時候,並不能滿足於子類的需要,比如獲取薪水的方法getSalary(),子類Manager還有個獎金bonus需要加進去,才是manager正確的薪水
所以這個時候我們子類要覆蓋重寫超類中的getSalary()方法
我們怎麼獲取到超類中私有的salary屬性呢,那只有通過超類中的getSalary()公共方法獲取,如果我們直接在子類的getSalary()方法中寫getSalary(),那程式只會無限次的呼叫自己的getSalary(),直到程式崩 潰,這個時候我們引入一個super關鍵詞,通過super.getSalary()就可以獲得超類的salary屬性了
記住super不是一個物件的引用,只是指示編譯器呼叫超類方法的特殊關鍵詞,和this的概念不一樣
public Manager(String name,double salary,int year,int month,int day){ super(name,salary,year,month,day); bonus = 0; }
5、超類Employee類中的變數都是私有的,我們在子類中怎麼提供一個構造器呢,這時可以利用supper()特殊語法,不過super呼叫構造器的語句必須在子類構造器的第一條
6、如果子類構造器沒有顯示的呼叫超類的構造器,將自動呼叫超類的無參構造器;如果超類中沒有無參構造器,並且子類的構造器中又沒有顯式的呼叫超類的其他構造器,java編譯器就會報錯
7、this和super關鍵詞的兩層含義:
this:一是指示隱式引數的引用,二是呼叫該類的其他構造器
super:一是呼叫超類的方法,二是呼叫超類的構造器