第二十四、Java面向對象三大特性之繼承與super關鍵字

面向對象的三大特徵:
1. 封裝
2. 繼承
3. 多態.

1、類和類之間的常見關係

    1:既然繼承是描述類和類之間的關係,就需要先來了解類和類之間的常見關係

1.1  現實生活的整體與部分

舉例說明

1:現實生活

    1:學生   是人 

    2:狗     是動物

    3:球隊包含 球員整體與部分的關係,部分可以刪除和增加

    4:筆記本包含 cpu 整體與部分的關係,部分不可以刪除和增加

    5:航母編隊包含(航母 護衛艦驅逐艦 艦載機核潛艇)

1.2  java中的類與類關係

java中的類關係

1:is a 關係(學生是人)

2:has a 整體與部分


2、繼承

    1:描述一個學生類

          1:姓名年齡學號屬性,學習的方法

    2:描述一個工人類

         1:姓名年齡工號屬性,工作的方法

    3:描述一個人類

         1:姓名年齡屬性,說話的方法。

    4:發現學生類和人類天生有着聯繫,學生和工人都是人。所以人有的屬性和行爲學生和工人都會有。出現類代碼重複



繼承:繼承是通過關鍵字extends體現的。

3、繼承的格式:

class 類名1 extends 類名2{

}

4、繼承要注意的事項:

1. 千萬不要爲了減少重複代碼而去繼承,只有真正存在着繼承關係的時候纔去繼承。
2. 父類私有的成員不能被繼承。
3. 父類的構造函數不能被繼承。
4. 創建子類對象時默認會先調用父類無參的構造函數。

//人類 
class Person{
	
	String name;
	private	int age;

	public  Person(String name){
		this.name = name;
	}

	public Person(){
		System.out.println("Person類的構造方法被調用了....");
	}

	public void eat(){
		System.out.println(name+"在吃飯...");
	}
}

//學生類
class Student extends Person {  // Student 就稱作爲Person類的子類, Person類就稱作爲Student的父類(超類、基類)

	int num; //學號

	public Student(){
		System.out.println("Student類的構造方法被調用了....");
	}

	public void study(){
		System.out.println(name+"good good study , day day up");
	}	
}


class MyClass 
{
	public static void main(String[] args) 
	{
		Student s = new Student();
		
		/*
		s.name = "二狗";
		System.out.println("名字:"+ s.name);
		s.eat();
		*/
	}
}


運行結果是:

LoveQideMacBook-Pro:Desktop loveqi$ java MyClass
Person類的構造方法被調用了....
Student類的構造方法被調用了....


疑問: 爲什麼要調用父類的構造方法啊?這樣子做的意義在那?
       調用父類 的構造方法是可以初始化從父類繼承下去的屬性的。

class Fu{
	
	int x = 10;
	String name;

	public Fu(String name){
		this.name = name;
		System.out.println("Fu類d帶參的構造方法...");
	}

	public Fu(){
		System.out.println("Fu類無參的構造方法...");
	}
}


class Zi extends Fu{

	int x = 20;

	public Zi(String name){
		super(name); //指定調用父類一個參數的構造函數。
	}

	public void print(){
		System.out.println("x1 = "+ x);
	}

}


class MyClass 
{
	public static void main(String[] args) 
	{
		Zi z = new Zi("大頭兒子"); 
		System.out.println("name= "+z.name);

	}
}

運行結果是:

LoveQideMacBook-Pro:Desktop loveqi$ java MyClass
Fu類d帶參的構造方法...
name= 大頭兒子


5、super關鍵字:

super關鍵字代表了父類空間的引用。
super關鍵字的 作用:
1. 子父類存在着同名的成員時,在子類中默認是訪問子類的成員,可以通過super關鍵字指定訪問父類的成員。
2. 創建子類對象時,默認會先調用父類無參的構造方法,可以通過super關鍵字指定調用父類的構造方法。


super關鍵字調用父類構造方法要注意的事項:
1. 如果在子類的構造方法上沒有指定調用父類的構造方法,那麼java編譯器會在子類的構造方法上面加上super()語句。
2. super關鍵字調用父類的構造函數時,該語句必須要是子類構造函數中的第一個語句。
3. super與this關鍵字不能同時出現在同一個構造函數中調用其他的構造函數。因爲兩個語句都需要第一個語句。

6、super關鍵字與this關鍵字的區別:

1. 代表的事物不一致。
    1) super關鍵字代表的是父類空間的引用。
    2) this關鍵字代表的是所屬函數的調用者對象。
2. 使用前提不一致。
    1) super關鍵字必須要有繼承關係才能使用。
    2) this關鍵字不需要存在繼承關係也可使用。
3. 調用構造函數的區別:
    1)  super關鍵字是調用父類的構造函數。
    2)  this關鍵字是調用本類的構造函數。


class Fu{
		
	int x = 10;
	String name;

	public Fu(){
		System.out.println("Fu類無參的構造方法..");
	}

	public Fu(String name){
		this.name = name;
		System.out.println("Fu類帶參的構造方法..");
	}

	public void eat(){
		System.out.println("小頭爸爸吃番薯..");
	}
}


class Zi extends Fu{
	
	int x = 20; 
	int num;
	
	public Zi(String name,int num){
		super(name); //指定調用了父類帶參的 構造方法...
		this(); // 調用本類無參構造方法..
		//super(); //指定調用了父類無參構造方法。。。
		System.out.println("Zi類帶參的構造方法..");
	}

	public Zi(){
		System.out.println("Zi類無參的構造方法..");
	}


	public void print(){
		System.out.println("x = " +super.x);
	}

	public void eat(){
		System.out.println("大頭兒子吃龍蝦..");
	}
}

class MyClass {

	public static void main(String[] args) 
	{
		Zi z = new Zi("二蛋");
	
	}
}

運行結果是:

LoveQideMacBook-Pro:Desktop loveqi$ javac MyClass.java
MyClass.java:28: 錯誤: 對this的調用必須是構造器中的第一個語句
		this(); // 調用本類無參構造方法..
		    ^
MyClass.java:51: 錯誤: 對於Zi(String), 找不到合適的構造器
		Zi z = new Zi("二蛋");
		       ^
    構造器 Zi.Zi(String,int)不適用
      (實際參數列表和形式參數列表長度不同)
    構造器 Zi.Zi()不適用
      (實際參數列表和形式參數列表長度不同)
2 個錯誤


子類的構造函數默認第一行會默認調用父類無參的構造函數,隱式語句

super();

           1:父類無參構造函數不存在,編譯報錯。

  

Son(int y) {

       //super();隱式語句

       this.y = y + x;

       System.out.println("這是子類的有參構造");

    }

 

    子類顯式調用父類構造函數

在子類構造函數第一行通過super關鍵字調用父類任何構造函數。如果顯式調用父類構造函數,編譯器自動添加的調用父類無參數的構造就消失。構造函數間的調用只能放在第一行,只能調用一次。super()和this()不能同時存在構造函數第一行。

Son(int y) {

       super(y);// 子類顯式調用父類構造函數

       this.y = y + x;

       System.out.println("這是子類的有參構造");

    }

 

Son(int y) {

       this();  //不能同時存在構造函數第一行 

       super(y);

       this.y = y + x;

       System.out.println("這是子類的有參構造");

    }

 

super思考

如果開發者自定義了一個類,沒有顯示的進行類的繼承,那麼該類中成員函數是否可以使用super關健健字?可以使用,繼承了Object類,Object類是所有類的父類。

class MyClass {

    public  void print(){

       System.out.println(super.toString());

    }

    public static void main(String[] args){

       new Demo7().print();

       System.out.println();

        }

}




7、繼承特點

    1:描述類和類之間的關係

    2:降低類和類之間的重複代碼

           1)降低對象和對象之間的代碼重複使用靜態變量

           2:降低類和類之間的代碼重複使用就繼承

    

8、繼承細節:   

    1:類名的設定,被繼承的類稱之爲父類(基類),繼承的類稱之爲子類

    2:子類並不能繼承父類中所有的成員

           1)父類定義完整的成員 靜態成員,非靜態,構造方法。靜態變量和靜態方法都可以通過子類名.父類靜態成員的形式調用成功。

           2)所有的私有成員不能繼承,private修飾的成員。

           3)構造函數不能被繼承

    3:如何使用繼承

         1)不要爲了使用繼承而繼承。工人和學生都有共性的成員,不要爲了節省代碼,讓工人繼承學生。





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章