1. 程式人生 > >Java中一些有意思的東西(3)

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 有參構造");
	}
}

關於方法

* 方法重寫:子類中出現了和父類中方法宣告一模一樣的方法。與返回值型別有關,返回值是一致(或者是子父類)的     * 方法過載:本類中出現的方法名一樣,引數列表不同的方法。與返回值型別無關。

    * 子類物件呼叫方法的時候: 先找子類本身,再找父類。  本身有了就不需要再呼叫父類的,沒有的再在父類中尋找。