Java中一些有意思的東西(3)
繼承
* A:Java中類的繼承特點 * a:Java只支援單繼承,不支援多繼承。(一個兒子只能有一個爹) * 有些語言是支援多繼承,如c++,格式:extends 類1,類2,... * b:Java支援多層繼承(繼承體系)* B:案例演示 * Java中類的繼承特點 * 如果想用這個體系的所有功能用最底層的類建立物件 * 如果想看這個體系的共性功能,看最頂層的類
class DemoA { public void show() { System.out.println("DemoA"); } // 所有類中都有的方法在最上層,為show() } class DemoB extends DemoA { public void method() { System.out.println("DemoB"); } } class DemoC extends DemoB { public void print() { System.out.println("DemoC"); } // 擁有最多方法的類在最下層,擁有 show(), method(), print() }
繼承要注意的東西
* a:子類只能繼承父類所有非私有的成員(成員方法和成員變數) * b:子類不能繼承父類的構造方法,但是可以通過super關鍵字去訪問父類構造方法。
class Demo3_Extends { public static void main(String[] args) { Son s = new Son(); s.show(); } } class Father { private String name; private void show() { System.out.println("Hello World!"); } } class Son extends Father { //super.show(); }
* c:不要為了部分功能而去繼承
繼承中變數的關係
* A:this和super都代表什麼 * this:代表當前物件的引用,誰來呼叫我,我就代表誰 * super:代表當前物件父類的引用* B:this和super的使用區別 * a:呼叫成員變數 * this.成員變數 呼叫本類的成員變數,也可以呼叫父類的成員變數 * super.成員變數 呼叫父類的成員變數 * b:呼叫構造方法 * this(...) 呼叫本類的構造方法 * super(...) 呼叫父類的構造方法 * c:呼叫成員方法 * this.成員方法 呼叫本類的成員方法,也可以呼叫父類的方法 * super.成員方法 呼叫父類的成員方法
class Father {
int num1 = 10;
int num2 = 30;
}
class Son extends Father {
int num2 = 20;
public void print() {
System.out.println(this.num1);
//this既可以呼叫本類的,也可以呼叫父類的(本類沒有的情況下)
System.out.println(this.num2);
//就近原則,子類有就不用父類的了 this.num2 = 20
System.out.println(super.num2);
//super.num2 = 30
}
}
*A: * 子類中所有的構造方法預設都會訪問父類中空引數的構造方法 * B:為什麼呢? * 因為子類會繼承父類中的資料,可能還會使用父類的資料。 * 所以,子類初始化之前,一定要先完成父類資料的初始化。 * 其實: * 每一個構造方法的第一條語句預設都是:super() Object類最頂層的父類。
class Father extends Object {
public Father() {
super();
System.out.println("Father 的構造方法");
}
}
class Son extends Father {
public Son() {
super();
//這是一條語句,如果不寫,系統會預設加上,用來訪問父類中的空參構造
System.out.println("Son 的構造方法");
}
}
* 父類沒有無參構造方法,子類怎麼辦?
1. super解決 2. this解決
class Father {
private String name; //姓名
private int age; //年齡
public Father() { //空參構造
System.out.println("Father 空參構造");
}
public Father(String name,int age) { //有參構造
this.name = name;
this.age = age;
System.out.println("Father 有參構造");
}
public void setName(String name) { //設定姓名
this.name = name;
}
public String getName() { //獲取姓名
return name;
}
public void setAge(int age) { //設定年齡
this.age = age;
}
public int getAge() { //獲取年齡
return age;
}
}
class Son extends Father {
public Son() { //空參構造
this("王五",25); //本類中的構造方法
//super("李四",24); //呼叫父類中的構造方法
System.out.println("Son 空參構造");
}
public Son(String name,int age) { //有參構造
super(name,age);
System.out.println("Son 有參構造");
}
}
關於方法
* 方法重寫:子類中出現了和父類中方法宣告一模一樣的方法。與返回值型別有關,返回值是一致(或者是子父類)的 * 方法過載:本類中出現的方法名一樣,引數列表不同的方法。與返回值型別無關。
* 子類物件呼叫方法的時候: 先找子類本身,再找父類。 本身有了就不需要再呼叫父類的,沒有的再在父類中尋找。