繼承&修飾符

Mr.魏(魏先生)發表於2020-11-01

1. 繼承

1.1 繼承的實現(掌握)

  • 繼承的概念

    • 繼承是物件導向三大特徵之一,可以使得子類具有父類的屬性和方法,還可以在子類中重新定義,以及追加屬性和方法
  • 實現繼承的格式

    • 繼承通過extends實現
    • 格式:class 子類 extends 父類 { }
      • 舉例:class Dog extends Animal { }
  • 繼承帶來的好處

    • 繼承可以讓類與類之間產生關係,子父類關係,產生子父類後,子類則可以使用父類中非私有的成員。
  • 示例程式碼

    public class Fu {
        public void show() {
            System.out.println("show方法被呼叫");
        }
    }
    public class Zi extends Fu {
        public void method() {
            System.out.println("method方法被呼叫");
        }
    }
    public class Demo {
        public static void main(String[] args) {
            //建立物件,呼叫方法
            Fu f = new Fu();
            f.show();
    
            Zi z = new Zi();
            z.method();
            z.show();
        }
    }
    

1.2 繼承的好處和弊端(理解)

  • 繼承好處
    • 提高了程式碼的複用性(多個類相同的成員可以放到同一個類中)
    • 提高了程式碼的維護性(如果方法的程式碼需要修改,修改一處即可)
  • 繼承弊端
    • 繼承讓類與類之間產生了關係,類的耦合性增強了,當父類發生變化時子類實現也不得不跟著變化,削弱了子類的獨立性
  • 繼承的應用場景:
    • 使用繼承,需要考慮類與類之間是否存在is…a的關係,不能盲目使用繼承
      • is…a的關係:誰是誰的一種,例如:老師和學生是人的一種,那人就是父類,學生和老師就是子類

2. 繼承中的成員訪問特點

2.1 繼承中變數的訪問特點(掌握)

在子類方法中訪問一個變數,採用的是就近原則。

  1. 子類區域性範圍找
  2. 子類成員範圍找
  3. 父類成員範圍找
  4. 如果都沒有就報錯(不考慮父親的父親…)
  • 示例程式碼

    class Fu {
        int num = 10;
    }
    class Zi {
        int num = 20;
        public void show(){
            int num = 30;
            System.out.println(num);
        }
    }
    public class Demo1 {
        public static void main(String[] args) {
            Zi z = new Zi();
            z.show();	// 輸出show方法中的區域性變數30
        }
    }
    

2.2 super(掌握)

  • this&super關鍵字:
    • this:代表本類物件的引用
    • super:代表父類儲存空間的標識(可以理解為父類物件引用)
  • this和super的使用分別
    • 成員變數:
      • this.成員變數 - 訪問本類成員變數
      • super.成員變數 - 訪問父類成員變數
    • 成員方法:
      • this.成員方法 - 訪問本類成員方法
      • super.成員方法 - 訪問父類成員方法
  • 構造方法:
    • this(…) - 訪問本類構造方法
    • super(…) - 訪問父類構造方法

2.3 繼承中構造方法的訪問特點(理解)

注意:子類中所有的構造方法預設都會訪問父類中無參的構造方法

​ 子類會繼承父類中的資料,可能還會使用父類的資料。所以,子類初始化之前,一定要先完成父類資料的初始化,原因在於,每一個子類構造方法的第一條語句預設都是:super()

問題:如果父類中沒有無參構造方法,只有帶參構造方法,該怎麼辦呢?

1. 通過使用super關鍵字去顯示的呼叫父類的帶參構造方法
2. 在父類中自己提供一個無參構造方法

推薦方案:

​ 自己給出無參構造方法

2.4 繼承中成員方法的訪問特點(掌握)

通過子類物件訪問一個方法

  1. 子類成員範圍找
  2. 父類成員範圍找
  3. 如果都沒有就報錯(不考慮父親的父親…)

2.5 super記憶體圖(理解)

  • 物件在堆記憶體中,會單獨存在一塊super區域,用來存放父類的資料

    [外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-zosich8C-1604238838088)(F:\TeachRes\2019\JavaSe\day01\筆記\筆記資源包\圖片1.png)]

2.6 方法重寫(掌握)

  • 1、方法重寫概念
    • 子類出現了和父類中一模一樣的方法宣告(方法名一樣,引數列表也必須一樣)
  • 2、方法重寫的應用場景
    • 當子類需要父類的功能,而功能主體子類有自己特有內容時,可以重寫父類中的方法,這樣,即沿襲了父類的功能,又定義了子類特有的內容
  • 3、Override註解
    • 用來檢測當前的方法,是否是重寫的方法,起到【校驗】的作用

2.7 方法重寫的注意事項(掌握)

  • 方法重寫的注意事項
  1. 私有方法不能被重寫(父類私有成員子類是不能繼承的)
  2. 子類方法訪問許可權不能更低(public > 預設 > 私有)
  • 示例程式碼
public class Fu {
    private void show() {
        System.out.println("Fu中show()方法被呼叫");
    }

    void method() {
        System.out.println("Fu中method()方法被呼叫");
    }
}

public class Zi extends Fu {

    /* 編譯【出錯】,子類不能重寫父類私有的方法*/
    @Override
    private void show() {
        System.out.println("Zi中show()方法被呼叫");
    }
   
    /* 編譯【出錯】,子類重寫父類方法的時候,訪問許可權需要大於等於父類 */
    @Override
    private void method() {
        System.out.println("Zi中method()方法被呼叫");
    }

    /* 編譯【通過】,子類重寫父類方法的時候,訪問許可權需要大於等於父類 */
    @Override
    public void method() {
        System.out.println("Zi中method()方法被呼叫");
    }
}

2.8. Java中繼承的注意事項(掌握)

  • Java中繼承的注意事項

    1. Java中類只支援單繼承,不支援多繼承
      • 錯誤範例:class A extends B, C { }
    2. Java中類支援多層繼承
  • 多層繼承示例程式碼:

    public class Granddad {
    
        public void drink() {
            System.out.println("爺爺愛喝酒");
        }
    
    }
    
    public class Father extends Granddad {
    
        public void smoke() {
            System.out.println("爸爸愛抽菸");
        }
    
    }
    
    public class Mother {
    
        public void dance() {
            System.out.println("媽媽愛跳舞");
        }
    
    }
    public class Son extends Father {
    	// 此時,Son類中就同時擁有drink方法以及smoke方法
    }
    

3. 繼承練習

3.1 老師和學生(應用)

  • 需求:定義老師類和學生類,然後寫程式碼測試;最後找到老師類和學生類當中的共性內容,抽取出一個父類,用繼承的方式改寫程式碼,並進行測試

  • 步驟:

    ①定義老師類(姓名,年齡,教書())

    ②定義學生類(姓名,年齡,學習())

    ③定義測試類,寫程式碼測試

    ④共性抽取父類,定義人類(姓名,年齡)

    ⑤定義老師類,繼承人類,並給出自己特有方法:教書()

    ⑥定義學生類,繼承人類,並給出自己特有方法:學習()

    ⑦定義測試類,寫程式碼測試

  • 示例程式碼:

    class Person {
        private String name;
        private int age;
    
        public Person() {
        }
    
        public Person(String name, int age) {
            this.name = name;
            this.age = age;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public int getAge() {
            return age;
        }
    
        public void setAge(int age) {
            this.age = age;
        }
    }
    
    class Teacher extends Person {
    
        public Teacher() {}
    
        public Teacher(String name,int age) {
            super(name,age);
        }
    
        public void teach() {
            System.out.println("用愛成就每一位學員");
        }
    
    }
    
    class Student extends Person{
        public Student() {}
        
        public Student(String name, int age) {
            super(name,age);
        }
        
        public void study(){
            System.out.println("學生學習");
        }
        
    }
    
    class PersonDemo {
        public static void main(String[] args){
            //建立老師類物件並進行測試
            Teacher t1 = new Teacher();
            t1.setName("林青霞");
            t1.setAge(30);
            System.out.println(t1.getName() + "," + t1.getAge());
            t1.teach();
    
    
            Teacher t2 = new Teacher("風清揚", 33);
            System.out.println(t2.getName() + "," + t2.getAge());
            t2.teach();
            
            // 建立學生類物件測試
            Student s = new Student("張三"23);
            System.out.println(s.getName() + "," + s.getAge());
            s.study();
        }
    }
    

3.2 貓和狗( 應用)

  • 需求:請採用繼承的思想實現貓和狗的案例,並在測試類中進行測試

  • 分析:

    ①貓:

    ​ 成員變數:姓名,年齡

    ​ 構造方法:無參,帶參

    ​ 成員方法:get/set方法,抓老鼠()

    ②狗:

    ​ 成員變數:姓名,年齡

    ​ 構造方法:無參,帶參

    ​ 成員方法:get/set方法,看門()

    ③共性:

    ​ 成員變數:姓名,年齡;構造方法:無參,帶參;成員方法:get/set方法

  • 步驟:

    1、定義動物類(Animal)

    ​ 【成員變數:姓名,年齡】【 構造方法:無參,帶參】【成員方法:get/set方法】

    2、定義貓類(Cat),繼承動物類

    ​ 【構造方法:無參,帶參】【成員方法:抓老鼠() 】

    3、定義狗類(Dog),繼承動物類

    ​ 【構造方法:無參,帶參】【成員方法:看門() 】

    4、定義測試類(AnimalDemo),寫程式碼測試

  • 示例程式碼:

    class Animal {
        private String name;
        private int age;
    
        public Animal() {
        }
    
        public Animal(String name, int age) {
            this.name = name;
            this.age = age;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public int getAge() {
            return age;
        }
    
        public void setAge(int age) {
            this.age = age;
        }
    }
    class Cat extends Animal {
    
        public Cat() {
        }
    
        public Cat(String name, int age) {
            super(name, age);
        }
    
        public void catchMouse() {
            System.out.println("貓抓老鼠");
        }
    }
    class Dog extends Animal {
    
        public Dog() {
        }
    
        public Dog(String name, int age) {
            super(name, age);
        }
    
        public void lookDoor() {
            System.out.println("狗看門");
        }
    }
    /*
        測試類
     */
    public class AnimalDemo {
        public static void main(String[] args) {
            //建立貓類物件並進行測試
            Cat c1 = new Cat();
            c1.setName("加菲貓");
            c1.setAge(5);
            System.out.println(c1.getName() + "," + c1.getAge());
            c1.catchMouse();
    
            Cat c2 = new Cat("加菲貓", 5);
            System.out.println(c2.getName() + "," + c2.getAge());
            c2.catchMouse();
        }
    }
    

4. 修飾符

4.1 package(瞭解)

  • 1、包的概念
    • 包就是資料夾,用來管理類檔案的
  • 2、包的定義格式
    • package 包名; (多級包用.分開)
    • 例如:package com.heima.demo;
  • 3、帶包編譯&帶包執行
    • 帶包編譯:javac –d . 類名.java
      • 例如:javac -d . com.heima.demo.HelloWorld.java
    • 帶包執行:java 包名+類名
      • 例如:java com.heima.demo.HelloWorld

4.2 import(理解)

  • 導包的意義

    使用不同包下的類時,使用的時候要寫類的全路徑,寫起來太麻煩了

    為了簡化帶包的操作,Java就提供了導包的功能

  • 導包的格式

    格式:import 包名;

    範例:import java.util.Scanner;

  • 示例程式碼(沒有使用導包,建立的Scanner物件)

package com.heima;

public class Demo {
    public static void main(String[] args) {
        // 1. 沒有導包,建立Scnaner物件
        java.util.Scanner sc = new java.util.Scanner(System.in);
    }
}
  • 示例程式碼(使用導包後,建立的Scanner物件)
package com.heima;

import java.util.Scanner;

public class Demo {
    public static void main(String[] args) {
        // 1. 沒有導包,建立Scnaner物件
        Scanner sc = new Scanner(System.in);
    }
}

4.3 許可權修飾符(理解)

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-ERRyv4dE-1604238838091)(F:\TeachRes\2019\JavaSe\day01\筆記\筆記資源包\圖片2.png)]

4.4 final(應用)

  • fianl關鍵字的作用
    • final代表最終的意思,可以修飾成員方法,成員變數,類
  • final修飾類、方法、變數的效果
    • fianl修飾類:該類不能被繼承(不能有子類,但是可以有父類)
    • final修飾方法:該方法不能被重寫
    • final修飾變數:表明該變數是一個常量,不能再次賦值

4.5 final修飾區域性變數(理解)

  • fianl修飾基本資料型別變數

    • final 修飾指的是基本型別的資料值不能發生改變
  • final修飾引用資料型別變數

    • final 修飾指的是引用型別的地址值不能發生改變,但是地址裡面的內容是可以發生改變的

    • 舉例:

      public static void main(String[] args){
          final Student s = new Student(23);
        	s = new Student(24);  // 錯誤
       	s.setAge(24);  // 正確
      }
      

4.6 static(應用)

  • static的概念
    • static關鍵字是靜態的意思,可以修飾【成員方法】,【成員變數】
  • static修飾的特點
    1. 被類的所有物件共享,這也是我們判斷是否使用靜態關鍵字的條件
    2. 可以通過類名呼叫當然,也可以通過物件名呼叫**【推薦使用類名呼叫】**
  • 示例程式碼:
class Student {

    public String name; //姓名
    public int age; //年齡
    public static String university; //學校	共享資料!所以設計為靜態!

    public void show() {
        System.out.println(name + "," + age + "," + university);
    }

}

public class StaticDemo {
    public static void main(String[] args) {
	    // 為物件的共享資料賦值
        Student.university = "大學";

        Student s1 = new Student();
        s1.name = "林青霞";
        s1.age = 30;
        s1.show();

        Student s2 = new Student();
        s2.name = "風清揚";
        s2.age = 33;
        s2.show();
    }
}

4.7 static訪問特點(掌握)

  • static的訪問特點
    • 非靜態的成員方法
      • 能訪問靜態的成員變數
      • 能訪問非靜態的成員變數
      • 能訪問靜態的成員方法
      • 能訪問非靜態的成員方法
    • 靜態的成員方法
      • 能訪問靜態的成員變數
      • 能訪問靜態的成員方法
    • 總結成一句話就是:
      • 靜態成員方法只能訪問靜態成員

相關文章