1. 程式人生 > 其它 >java學習-面向物件的三個特徵

java學習-面向物件的三個特徵

面向物件三大特性

1. 封裝

概念:隱藏物件內部的實現細節,控制物件中屬性的訪問和修改許可權。

訪問修飾符: private(僅本類可見)

class FengZhuang {
   private int age;
   
   public int getAge() {
       return this.age;
  }
   
   public void setAge(int val) {
     if(val > 0 && val < 120) {
         this.age = val
    } else {
         this.age = 18
    }
  }
}  
  1. 隱藏類內部實現過程

  2. 設定屬性值時,可以有效的過濾無用值

 

2. 類的繼承

  • 子類可以使用父類中的屬性和方法,子類也可以定義自己的屬性和方法。

  • 既可以提高程式碼的複用性,也可以提高程式碼的可擴充套件性。

  • java是單繼承,一個類只能有一個父類,但是可以多級繼承。屬性和方法也會逐級疊加。

    子級如何訪問爺爺級的重用的屬性和方法呢

 

不可繼承:

  • 構造方法:只負責建立本類,不可繼承。

    • 構造方法的特點:名稱與類名相同,且不能寫型別

      class Test {
         public Test() {...}
         // public void Test() {...} 錯誤
      }
  • 訪問修飾符:

    private修飾的屬性和方法僅本類可見;default僅同包父子類可見;

 

父子類中方法的重寫和覆蓋:

當父類中提供的方法無法滿足子類的需求時,可在子類中定義與父類相同的方法進行重寫

  • 重寫原則:方法名稱、引數列表、返回值型別必須與父類相同;訪問修飾符可等於或比父類更寬泛。(否則可能會報錯)

    public class TestExtends {
     public static void main(String[] args) {
       B b = new B();
       b.upload();
    }
    }

    class A {
     public void upload() {
       System.out.println("print function in A");
    }
    }

    class B extends A {
     public void upload() {
       System.out.println("print function in B");
    }
    }

    如果想在子類中訪問父類的方法或屬性(包括被重寫的),可以使用super.的形式。

     

繼承的物件構建過程:

super、建構函式和this:

  • super與this訪問屬性

    class A {
     int a = 1;
    }

    class B {
     int a = 2;
     public void print() {
       int a = 3;
       System.out.println(a);  // 3
       System.out.println(this.a);  // 2 (this.訪問本類的屬性和方法)
       System.out.println(super.a);  // 1 (super.訪問父類的屬性和方法)
    }
    }
  • super和建構函式

    class AS {
     public AS() {
       System.out.println("AS");
    }

     public AS(int age) {
       System.out.print("AS-");
       System.out.print(age);
       System.out.println();
    }
    }

    class BS extends AS {
     public BS() {
       super();
       System.out.println("BS");
    }

     public BS(int age) {
       super(age + 1);
       System.out.print("BS-");
       System.out.print(age);
       System.out.println();
    }
    }
    1. 在建構函式中通過super()呼叫父類的構造方法(通過傳參或不傳參可以控制執行AS的哪一個構造方法)

    2. super或this如果使用在建構函式中,必須放在首行;

    3. 子類中如果使用了this()/this(實參)就不能在呼叫super。(在建構函式中呼叫this()會報遞迴呼叫的錯,那什麼情況下可以呼叫

    4. 在子類建構函式中如果沒有呼叫super,則預設執行super();

 

3. 多型

概念:父類引用指向子類物件,從而產生多種形態。

   Animal a = new Dog()
// 引用型別------物件型別
  1. Animal和Dog要有直接或者間接的繼承關係。

  2. 父類引用僅可以呼叫父類所宣告的屬性和方法,不可呼叫子類獨有的屬性和方法 。

 

多型的作用:

  1. 遮蔽子類間的差異。

  2. 靈活、耦合度低。

 

多型中方法的重寫

  • 實際執行過程中依舊遵循重寫原則。既amt.fn()的執行結果BMT中方法的執行結果

  • 子類中獨有的方法不能在父類引用物件中呼叫。既amt.fnB()會報錯。

class MultiType {
 public MultiType() {
   AMT amt = new BMT();
   amt.fn();   // fn in BMT
   // amt.fnB(); // 或報錯
}
}

class AMT {
 public void fn() {
   System.out.println("fn in AMT");
}
}

class BMT extends AMT {
 public void fn() {
   System.out.println("fn in BMT");
}
 public void fnB() {
   System.out.println("fn in BMT only");
}
}

 

應用場景:

  1. 使用父類作為方法形參實現多型,使方法的引數型別更為寬泛。

  2. 使用父類作為方法返回值實現多型,使方法可以返回不同子類物件。

  3. 向上轉型(裝箱)

  4. 向下轉型(拆箱)

  5. 向下轉型中的異常

  6. instanceof