1. 程式人生 > >java基礎-------面向物件三大特性:封裝、繼承、多型

java基礎-------面向物件三大特性:封裝、繼承、多型

面向物件三大特性: 封裝、繼承、多型;
一、封裝
1、定義:
封裝就是將類的資訊隱藏在類內部,不允許外部程式直接訪問,而是通過該類的方法實現對隱藏資訊的操作和訪問。
2、實現方法:
使用private關鍵字修飾 類內部的屬性;
3、如何訪問:
在類內部定義get、set方法,實行使用物件呼叫方法對內部屬性進行操作;
可參考我的另一篇文章,類和物件(oop)
二、繼承
1、定義:類與類的一種關係,Java中是單繼承,一個子類只能有一個父類,,一個父類可以有多個子類。
2、子類有自己的屬性和方法,
3、 子類可以重寫父類的方法;
4、子類擁有父類非private的屬性和方法

5、 extends關鍵字;

class father {   //  此處是基類(父類)
	private int age;
	private String name;
	private char sex;
}
calss son  extends {  //   繼承了father類,son類成了father類的子類	
}

3、super關鍵字;
super();—>呼叫父類的建構函式
super.父類非私有的資料成員—>訪問父類的資料成員
super.fun();—>呼叫父類的成員方法
使用super呼叫父類的構造方法時,應該將此程式碼放置句首;

public class TestSuper {
	public static void main(String args[]) {
		ChildClass C1 =new ChildClass(100,200);         //   建立子類的物件
		C1.f();																	
	} 
}

class FatherClass{
	public int value;
	public 	FatherClass(int val) {       
		this.value=val;
		}
	public void f() {
		 value=100;
		System.out.println("Fatherclass的value值是"+value);
	}
}

class ChildClass extends FatherClass{
	public int value;
	public ChildClass(  int valueF, int valueC) {
		super(valueF);  							 //   呼叫父類的構造方法
		this.value=valueC;
	}
	public void f() {    //  子類方法,
		super.f();       //   使用super在子類中呼叫父類的方法;
		System.out.println("ChildClass的value值是"+value);  	// value》》》200
		System.out.println(value);  // 200
		System.out.println(super.value);    //  呼叫父類的非私有屬性value      》》》100
	}
}

三:多型
定義:指的是是同一個方法呼叫,由於物件的不同可能會有不同的行為;
1:多型勢方法的多型,不是屬性的多型,(多型與屬性無關)
2:多型的存在有三個必要條件:繼承、方法重寫、父類引用指向子類;
3:父類引用指向子類後,該父類引用呼叫子類重寫的方法,此時多型就出現;
多型記憶體分析
在將父類引用指向子類之後,反編譯之後卻發現呼叫的仍然是父類方法,其原因是因為
將父類引用指向子類物件後,在堆中產生的子類物件擁有父類的非私有屬性,同時在編譯時,在方法區產生一個方法表,頂部存有物件的地址,其餘是父類和子類可以呼叫的方法;在編譯時,將子類方法的地址賦值給父類方法,因此呼叫其實父類方法的地址是指向了子類的方法;
圖解:、
在這裡插入圖片描述

public class test {
	public static void main(String args []) {
		animal a= new animal();
	    animal d=new tiger();// 這裡是強制向上轉型,編譯器認為 d 為animal, 將父類引用指向子類  
	   d.shout();    //  多型
	   d.eat();       	//  tiger類中並沒有eat()方法,此處是呼叫父類方法;
	}
	static void animalCry(animal a){     // 使用父類的物件引用來呼叫子類方法。實現多型
		a.eat();
	}
}

class animal{   //  =============================== 父類
	public void shout() { //================父類方法1
		System.out.println("動物叫一聲");
		
	}		
	public void eat() {		//================父類方法2
		System.out.println("動物吃飯時候要叫一聲");
		shout();
	}
}

class dog extends animal{				//================子類1
	public void shout() {   // 重寫父類方法
		System.out.println("汪汪汪");
	}
}

class tiger extends animal{				//================子類2
	public void shout() {	// 重寫父類方法
		System.out.println("老虎嘶吼");
	}
}	

4、重寫(覆蓋)與過載:
過載(overload):指多個方法享有相同的名字,但是引數不同或者是引數型別不同(僅僅通過返回值不同不能區分是否過載);
重寫(override):指子類繼承父類方法,但是改寫方法內容;
放一張圖片形象比喻
在這裡插入圖片描述