繼承&修飾符
文章目錄
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的關係:誰是誰的一種,例如:老師和學生是人的一種,那人就是父類,學生和老師就是子類
- 使用繼承,需要考慮類與類之間是否存在is…a的關係,不能盲目使用繼承
2. 繼承中的成員訪問特點
2.1 繼承中變數的訪問特點(掌握)
在子類方法中訪問一個變數,採用的是就近原則。
- 子類區域性範圍找
- 子類成員範圍找
- 父類成員範圍找
- 如果都沒有就報錯(不考慮父親的父親…)
-
示例程式碼
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 繼承中成員方法的訪問特點(掌握)
通過子類物件訪問一個方法
- 子類成員範圍找
- 父類成員範圍找
- 如果都沒有就報錯(不考慮父親的父親…)
2.5 super記憶體圖(理解)
-
物件在堆記憶體中,會單獨存在一塊super區域,用來存放父類的資料
2.6 方法重寫(掌握)
- 1、方法重寫概念
- 子類出現了和父類中一模一樣的方法宣告(方法名一樣,引數列表也必須一樣)
- 2、方法重寫的應用場景
- 當子類需要父類的功能,而功能主體子類有自己特有內容時,可以重寫父類中的方法,這樣,即沿襲了父類的功能,又定義了子類特有的內容
- 3、Override註解
- 用來檢測當前的方法,是否是重寫的方法,起到【校驗】的作用
2.7 方法重寫的注意事項(掌握)
- 方法重寫的注意事項
- 私有方法不能被重寫(父類私有成員子類是不能繼承的)
- 子類方法訪問許可權不能更低(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中繼承的注意事項
- Java中類只支援單繼承,不支援多繼承
- 錯誤範例:class A extends B, C { }
- Java中類支援多層繼承
- 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
- 帶包編譯:javac –d . 類名.java
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 許可權修飾符(理解)
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修飾的特點
- 被類的所有物件共享,這也是我們判斷是否使用靜態關鍵字的條件
- 可以通過類名呼叫當然,也可以通過物件名呼叫**【推薦使用類名呼叫】**
- 示例程式碼:
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的訪問特點
- 非靜態的成員方法
- 能訪問靜態的成員變數
- 能訪問非靜態的成員變數
- 能訪問靜態的成員方法
- 能訪問非靜態的成員方法
- 靜態的成員方法
- 能訪問靜態的成員變數
- 能訪問靜態的成員方法
- 總結成一句話就是:
- 靜態成員方法只能訪問靜態成員
- 非靜態的成員方法
相關文章
- C++繼承時的修飾符C++繼承
- TypeScript入門2:類、繼承、訪問修飾符TypeScript繼承
- JAVA物件導向高階:繼承:許可權修飾符(繼承注意事項) 單繼承 Object類 方法重寫Java物件繼承Object
- Vue - 按鍵修飾符 && 系統修飾符Vue
- Java 修飾符Java 修飾符
- java修飾符Java
- vue 事件修飾符Vue事件
- vue sync 修飾符Vue
- Java 常用修飾符Java
- 訪問修飾符
- Java 類與物件(繼承extends super關鍵詞 方法重寫 抽象abstract 訪問修飾符/許可權控制符)Java物件繼承抽象
- Java的static修飾符Java
- 許可權修飾符
- java中的修飾符Java
- 修飾符static和abstract
- java修飾符使用指南Java
- TypeScript 類訪問修飾符TypeScript
- Vue事件修飾符詳解Vue事件
- c語言中const修飾符C語言
- Day39--類修飾符
- Java的訪問修飾符Java
- Kotlin可見性修飾符Kotlin
- solidity 引用型別修飾符memory、calldata與storage 常量修飾符Constant與Immutable區別Solid型別LDA
- 正規表示式 u 修飾符
- 正規表示式 m 修飾符
- v-on 及其事件修飾符事件
- java oop 修飾符&關鍵字JavaOOP
- 從實踐認識修飾符
- Vue的.sync修飾符的使用Vue
- MongoDB ( 四 )高階_find修飾符MongoDB
- 正規表示式模式修飾符模式
- odoo 繼承(owl繼承、web繼承、view繼承)Odoo繼承WebView
- c#封裝、訪問修飾符C#封裝
- Vue .sync修飾符與$emit(update:xxx)VueMIT
- java常用修飾符(隨堂筆記)Java筆記
- C++函式修飾符總結C++函式
- Day33--屬性的修飾符
- C++學習——訪問修飾符C++