1. 程式人生 > 其它 >封裝 繼承 多型

封裝 繼承 多型

封裝

  • 該露的露,該藏的藏
    • 我們程式設計要追求”高內聚,低耦合“。高內聚就是類的內部資料操作細節自己完成,不允許外部干涉;低耦合:僅暴露少量的方法給外部使用。
  • 封裝(資料的隱藏)
    • 通常,應禁止直接訪問一個物件中資料的實際表示,而應通過介面來訪問,這稱為資訊隱藏。
  • 記住這句話就夠了:屬性私有,get/set
package com.oop.demo04;

//類     private:私有
public class Student {

    //屬性私有
    private String name;//名字
    private int id;//學號
    private char sex;//姓名
    private int age;


    //提供一些可以操作這個屬性的方法!
    //提供一些public 的 get、set 方法

    //get 獲得這個資料
    public String getName(){
        return this.name;
    }

    //set 給這個資料設定值
    public void setName(String name){
        this.name = name;
    }

    //alt + insert

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public char getSex() {
        return sex;
    }

    public void setSex(char sex) {
        this.sex = sex;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        if (age>120 || age<0){//不合法
            this.age = 3;
        }else {
            this.age = age;
        }
    }
}
package com.oop;

import com.oop.demo04.Student;
/*
    1. 提高程式的安全性,保護資料
    2. 隱藏程式碼的實現細節
    3. 統一介面
    4. 系統可維護增加了
 */
public class Application {
    public static void main(String[] args) {
        Student s1 = new Student();

        s1.setName("思源");

        System.out.println(s1.getName());

        s1.setAge(999);//不合法
        System.out.println(s1.getAge());
    }

}

判斷一個類的兩個方法是否相同 主要參考兩個東西:方法名;引數列表

繼承

  • 繼承的本質是對某一批類的抽象,從而實現對現實世界更好的建模。
  • extends的意思是“擴充套件”。子類是父類的擴充套件。
  • JAVA中類只有單繼承,沒有多繼承!
  • 繼承是類和類之間的一種關係。除此之外,類和類之間的關係還有依賴、組合 、聚合等。
  • 繼承關係的兩個類,一個為子類(派生類),一個為父類(基類)。子類繼承父類,使用關鍵字extends來表示。
  • 子類和父類之間,從意義上講應該具有“is a”的關係。
package com.oop;

import com.oop.demo05.Person;

public class Application {
    public static void main(String[] args) {


        Person person = new Person();

    }
}
package com.oop.demo05;

//在Java中,所有的類,都預設直接或者間接繼承object
//Person 人 : 父類
public class Person /*extends object*/{

    //public
    //protected
    //default
    //private
    private int money = 10_0000_0000;

    public void say(){
        System.out.println("說了一句話");
    }

    public int getMoney() {
        return money;
    }

    public void setMoney(int money) {
        this.money = money;
    }
}
package com.oop.demo05;

//Teacher  is  人 : 派生類,子類
public class Teacher extends Person{
}
package com.oop.demo05;

//學生    is  人 : 派生類,子類
//子類繼承父類,就會繼承父類的全部方法!
public class Student extends Person{

    //Ctrl + H
}
  • object (在Java中,所有的類,都預設直接或者間接繼承object)
  • super

super注意點:

  1. super呼叫父類的構造方法,必須在構造方法的第一個
  2. super 必須只能出現在子類的方法或者構造方法中!
  3. super 和 this 不能同時呼叫構造方法!

Vs this:

​ 代表的物件不同:

​ this:本身呼叫著這個物件

​ super:代表父類物件的應用

​ 前提

​ this:沒有繼承也可以使用

​ super:代表父類物件的應用

​ 構造方法

​ this():本類的構造

​ super():父類的構造!

package com.oop;

import com.oop.demo05.Student;

public class Application {
    public static void main(String[] args) {


        Student student = new Student();
        //student.test("思源");
        //student.test1();

    }
}
package com.oop.demo05;

//學生    is  人 : 派生類,子類
//子類繼承父類,就會繼承父類的全部方法!
public class Student extends Person{

    public Student() {
        //隱藏程式碼: 呼叫了父親類的無參構造
        super("name");//呼叫父親的構造器,必須要在子類構造器的第一行
        System.out.println("Student無參執行了");
    }

    private String name = "siyuan";

    public void print(){
        System.out.println("Student");
    }
    public void test1(){
        print();//Student
        this.print();//Student
        super.print();//Person
    }
    public void test(String name){
        System.out.println(name);//思源
        System.out.println(this.name);//siyuan
        System.out.println(super.name);//lin
    }
}
package com.oop.demo05;

//在Java中,所有的類,都預設直接或者間接繼承object
//Person 人 : 父類
public class Person /*extends object*/{

    public Person(String name){
        System.out.println("Person無參執行了");
    }

    protected String name = "lin";

    //私有的東西無法被繼承!
    public void print(){
        System.out.println("Person");
    }
}
  • 方法重寫:重點--->多型
package com.oop;

import com.oop.demo05.A;
import com.oop.demo05.B;

public class Application {

    //靜態的方法和非靜態的方法區別很大!
        //靜態方法:方法的呼叫只和左邊,定義的資料型別有關

        //非靜態:重寫
    public static void main(String[] args) {


        A a = new A();
        a.test();//A

        //父類的引用指向了子類
        B b = new A();//子類重寫了父類的方法
        b.test();//B

    }
}
package com.oop.demo05;

//繼承
public class A extends B{

    //Override 重寫
    @Override//註解:有功能的註解!
    public void test() {
        System.out.println("A=>test");
    }
}
package com.oop.demo05;

//重寫都是方法的重寫,和屬性無關
public class B {
    public void test(){
        System.out.println("B=>test");
    }
}

重寫:需要有繼承關係,子類重寫父類的方法!

  1. 方法名必須相同
  2. 引數列表必須相同
  3. 修飾符:範圍 可以擴大,但不能縮小: public>protect>default>private
  4. 丟擲的異常:範圍 可以縮小,但不能擴大:ClassNotFoundException --> Exception(大)

重寫,子類的方法和父類必須一致,方法體不同!

為什麼需要重寫:

​ 父類的功能,子類不一定需要,或者不一定滿足!

Alt + Insert : override;

多型

  • 即同一方法可以根據傳送物件的不同而採用多種不同的行為方式。
  • 一個物件的實際型別是確定的,但可以指向物件的引用型別有很多(父類,有關係的類)
  • 多型存在的條件
    • 有繼承關係
    • 子類重寫父類方法
    • 父類引用指向子類物件
  • 注意:多型是方法的多型,屬性沒有多型性
  • instanceof (型別轉換) 引用型別
package com.oop;

import com.oop.demo06.Person;
import com.oop.demo06.Student;

public class Application {
    public static void main(String[] args) {

        //一個物件的實際型別是確定的
        //new Student();
        //new Person();

        //可以指向的引用型別就不確定了:父類的引用指向子類

        //Student 能呼叫的方法都是自己的或者繼承父類的!
        Student s1 = new Student();
        //Person 父型別,可以指向子類,但是不能呼叫子類獨有的方法
        Person s2 = new Student();
        Object s3 = new Student();

        //物件能執行哪些方法,主要看物件左邊的型別,和右邊關係不大!
        ((Student)s2).eat();//子類重寫了父類的方法,執行子類的方法
        s1.eat();
    }
}
package com.oop.demo06;

public class Person {

    public void run(){
        System.out.println("run");
    }
}
package com.oop.demo06;

public class Student extends Person{

    @Override
    public void run() {
        System.out.println("son");
    }
    public void eat(){
        System.out.println("eat");
    }
}

多型注意事項:

  1. 多型是方法的多型,屬性沒有多型
  2. 父類和子類,有聯絡 型別轉換異常!ClassCastException!
  3. 存在條件:繼承關係,方法需要重寫,父類引用指向子類物件! Father f1 = new Son();

不能被重寫的(就更不可能實現多型):

  1. static 方法,屬於類,他不屬於例項
  2. final 常量
  3. private 方法

筆記出處——狂神老師