1. 程式人生 > >Java基礎之理解封裝,繼承,多型三大特性

Java基礎之理解封裝,繼承,多型三大特性

目錄

封裝

封裝隱藏了類的內部實現機制,可以在不影響使用的情況下改變類的內部結構,同時也保護了資料。對外界而已它的內部細節是隱藏的,暴露給外界的只是它的訪問方法。

程式碼理解

public class Student {

    public Student(String name, Integer age) {
        this.name = name;
        this.age = age;
    }

    private String name;
    private Integer age;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }
}

核心要點

  • 資料是私有的
  • 獲取只能通過getter方法
  • 更改只能通過setter方法

注意要點

  • getter方法禁止返回可變物件的引用,可變物件引用會破壞封裝(下面演示錯誤的使用封裝方法)

    public class Student {
    
        public Student(Date birthday) {
            this.birthday = birthday;
        }
    
        private Date birthday;
    
        public Date getBirthday() {
            return birthday;
        }
    
        public void setBirthday(Date birthday) {
            this.birthday = birthday;
        }
    }
    
    class Main{
        public static void main(String[] args) {
            Student student = new Student(new Date());
            System.out.println("student物件的Date:"+student.getBirthday());//student物件的Date:Tue Dec 11 10:50:50 CST 2018
            Date birthday = student.getBirthday();
            birthday.setTime(888888888);
            System.out.println("student物件的Date:"+student.getBirthday());//student物件的Date:Sun Jan 11 14:54:48 CST 1970
        }
    }
    

繼承

通過繼承建立的新類稱為“子類”或“派生類”,被繼承的類稱為“基類”、“父類”或“超類”。繼承的過程,就是從一般到特殊的過程。繼承概念的實現方式有二類:實現繼承與介面繼承。實現繼承是指直接使用基類的屬性和方法而無需額外編碼的能力;介面繼承是指僅使用屬性和方法的名稱、但是子類必須提供實現的能力;

程式碼理解

public class Student extends People {

}

class People{
    void sayHello(){
        System.out.println("Hello Word");
    }

}

class Main{
    public static void main(String[] args) {
        Student student = new Student();
        student.sayHello();
    }
}

核心要點

  • 子類會繼承父類的非private的屬性和方法
  • 可以在子類構造器中使用super關鍵字對父類private私有與域進行初始化
  • 在類的繼承層次中可以使用abstract定義抽象類作為派生其他類的基類
    • 包含一個或者多個的抽象方法必須宣告為抽象類
    • 抽象類不可以被例項化
    • 子類實現所有的抽象方法後不再是抽象類
    • 抽象類的層次中可以使用多型既抽象類物件變數引用非抽象類子類例項

多型

一個物件變數可以指向多種實際型別的現象被成為多型;在執行時能夠自動選擇呼叫那個方法被稱為動態繫結.

程式碼理解

public class Student extends People {
    @Override
    void sayHello(){
        System.out.println("I am a Student");
    }
    void studentHello(){
        System.out.println("It is student Say");
    }
}
class Teacher extends People{
}
class People{
    void sayHello(){
        System.out.println("Hello Word");
    }
}
class Main{
    public static void main(String[] args) {
        People people1 = new Teacher();
        People people2 = new Student();
        people1.sayHello();
        people2.sayHello();
        ((Student) people2).studentHello();
    }
}

核心要點

  • 要實現多型必須存在繼承關係(student和teacher都繼承people)

  • 子類需要將父類的方法重寫(繼承已經預設重寫),如果重寫了父類方法則會使用重寫方法

  • 需要將子類的引用賦值給父類,這樣父類變數就可以呼叫非子類特有方法

  • 父類引用不可以賦值給子類變數,如果必須需要;可以使用強制型別轉換,強制型別轉換會暫時忽略物件的實際型別,使用物件的全部功能

    Student student = (Student) new People();