1. 程式人生 > 其它 >Java繼承(一)

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,double
salary,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:一是呼叫超類的方法,二是呼叫超類的構造器