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):指子類繼承父類方法,但是改寫方法內容;
放一張圖片形象比喻