CoreJava 笔记总结-第五章 继承
文章目錄
- 第五章 繼承
- 類、超類和子類
- 定義子類
- 覆蓋方法
- 子類構(gòu)造器
- 多態(tài)
- 阻止繼承: `final`類和方法
- 強(qiáng)制類型轉(zhuǎn)換
- 抽象類
- 受保護(hù)訪問
- 訪問控制修飾符小結(jié)
- `Object`: 所有類的超類
- `Object`類型的變量
- `equals`方法
- 相等測試與繼承
- `hashCode`方法
- `toString`方法
- ==泛型數(shù)組列表==
- 聲明數(shù)組列表
- 訪問數(shù)組列表元素
- 類型化與原始數(shù)組列表的兼容性
- 對象包裝器與自動裝箱
- 參數(shù)數(shù)量可變的方法
- 枚舉類
- 反射
- `Class`類
- 聲明異常入門
- 利用反射分析類的能力
- 繼承的設(shè)計技巧
第五章 繼承
類、超類和子類
定義子類
- extend: 該關(guān)鍵字表示繼承
- extend: 表示正在構(gòu)造的類派生于一個已存在的類.這個已存在的類稱為超類(基類,父類). 新類稱為子類(派生類, 孩子類)
- 子類比超類擁有更多的功能
- 設(shè)計類: 最一般的類放在超類中, 更特殊的方法放入子類
覆蓋方法
-
super: 調(diào)用超類方法
public class Manager extends Employee {public double getSalary(){double baseSalary = super.getSalary();return baseSalary + bonus;} }
子類構(gòu)造器
-
由于Manager構(gòu)造器不能訪問Emplyee類的私有字段, 所以通過super來調(diào)用初始化這些私有字段
public Manager(String name, double salary, int year, int month, int day) {super(name, salary, year, month, day);//必須放在第一句bonus = 0; } -
this: 1. 隱式參數(shù)的引用 2. 調(diào)用該類的其他構(gòu)造器
super: 1. 調(diào)用其他超類的方法 2. 調(diào)用超類的構(gòu)造器
多態(tài)
- 多態(tài): 一個變量能夠指示多種實際類型的現(xiàn)象
- 上面的例子中boss, staff[0]指示同一個對象, 但是編譯器只將staff[0]看成一個Emplyee對象
- 子類引用的數(shù)組可以轉(zhuǎn)換成超類引用的數(shù)組
- 重載解析: 選擇所有名字相同的方法中存在一個與提供參數(shù)完全相匹配的方法
- 簽名: 方法的名字和參數(shù)列表. 返回類型不是簽名的一部分
- 在覆蓋一個方法時,子類方法不能低于超類方法的可見性.e.g.: 超類為public, 子類也必須為public
阻止繼承: final類和方法
- final類: 不允許擴(kuò)展的類, 其中的方法自動設(shè)置成為fianl方法, 不包括字段
- final方法: 子類不能覆蓋的方法
- fianl字段: 構(gòu)造對象后就不允許改變其值
強(qiáng)制類型轉(zhuǎn)換
-
Manager boss = (Manager) staff[0];
-
Manager boss = (Manager) staff[1]; // ERROR 拋出異常: ClassCastException
- if (staff[1] instanceof Manager){boss = (Manager) staff[1];.... }//查看能否強(qiáng)制類型轉(zhuǎn)換成功
-
繼承層次: 由一個公共類派生出來所有類的集合
- 只能在繼承層次類進(jìn)行強(qiáng)制類型轉(zhuǎn)換
- 在將超類強(qiáng)制類型轉(zhuǎn)換為子類之前, 應(yīng)該用instanceof進(jìn)行檢查
抽象類
-
位于上層的類更具有一般性,更加抽象
-
包含一個及以上抽象方法的類必須聲明為抽象類
- public abstract class Person {...public abstract String getDescription(); }
-
抽象類也可以包含字段和具體方法
-
抽象類不能實例化. new Person("dvsj"); //ERROR
-
可以定義一個抽象類的對象變量, 引用非抽象子類的對象
受保護(hù)訪問
- protected: 限制超類中某個方法只允許子類訪問, 希望允許子類的方法訪問超類的某個字段
- 保護(hù)字段只能由同一個包中的類訪問
訪問控制修飾符小結(jié)
Object: 所有類的超類
Object類型的變量
- 可以使用object類型的變量引用任何類型的對象
- 只能作為各種值的一個泛型容器, 進(jìn)行具體操作需要強(qiáng)制類型轉(zhuǎn)換
- 只有基本類型不是對象: 數(shù)值, 字符, 布爾類型的值
equals方法
- 該方法確定兩個對象的引用是否相等
- 子類中: if(!super.equals(otherObject)) return false; ...
相等測試與繼承
- equals方法要求: 自反性, 對稱性, 傳遞性, 一致性
- 比較數(shù)組元素是否相等, 使用靜態(tài)方法Arrays.equals
- @Override標(biāo)記要覆蓋超類的那些子類方法
hashCode方法
- 散列碼: 值由對象的儲存地址得出
- 字符串的散列碼時由內(nèi)容導(dǎo)出的
- Object.hasCode: null安全的方法
- Object.hash():組合多個散列值, 這個方法對于各個參數(shù)調(diào)用Object.hasCode()
- Arrays.hashCode:數(shù)組類型字段計算散列碼
- hasCode, equals方法必須兼容
toString方法
- x.toString() 等價于 "" + x
- System.out.println(x)會自動調(diào)用x.toString()
- 對于數(shù)組: Arrays.toString, Arrays.deepToString
泛型數(shù)組列表
- ArrayList類: 類似于數(shù)組, 在添加或者刪除數(shù)組元素時可以自動調(diào)整數(shù)組容量
- 它是一個有類型參數(shù)的泛型類
聲明數(shù)組列表
- 以下三種聲明方式等價
- add: 將元素添加到列表中
- ensureCapacity: 確保數(shù)組列表在不重新分配內(nèi)部儲存數(shù)組的情況下有足夠容量儲存給定數(shù)量的元素
- trimToSize: 將數(shù)組列表的存儲容量消減到當(dāng)前大小
- size: staff.size() 等價于數(shù)組的a.length, 表示實際包含元素個數(shù)
訪問數(shù)組列表元素
- get: 得到指定索引位置的值
- set: 重新設(shè)置索引位置已經(jīng)存在的值
- add(int index, E obj):后移元素從而插入obj到指定位置
- remov(int index): 刪除指定索引位置的元素, 后面的元素前移
- toArray: 將數(shù)組元素拷貝到一個數(shù)組中
類型化與原始數(shù)組列表的兼容性
- public class EmployeeDB {public void update(ArrayList list){...}public ArrayList find(String query) {...}
-
可以將類型化的數(shù)組列表傳遞給update, 不需要強(qiáng)制類型轉(zhuǎn)換
-
但是原始ArrayList賦給類型化ArrayList會有警告, 強(qiáng)制類型轉(zhuǎn)換也不可以消除警告,會引發(fā)類型轉(zhuǎn)換有誤的另一個警告
- @SuppressWarning("unchecked") ArrayList<Employee> result = (ArrayList<Employee>) emplyeeDB.find(x);
-
用以上注解標(biāo)記問題不太嚴(yán)重的強(qiáng)制類型轉(zhuǎn)換的變量
對象包裝器與自動裝箱
-
包裝器: 所有的基本類型對應(yīng)的類(Integer, Double, Long, Float, Short, Byte, Character, Boolean)
-
包裝器類是final, 不能派生子類
-
尖括號中的類型參數(shù)不允許是基本類型, 可以這樣var list = new ArrayList<Integer>();
-
自動裝箱:
list.add(3) --> list.add(Integer.valueOf(3)) -
自動拆箱:
- Integer a = 1000;
Integer b = 1000;
if (a == b) ..//通常失敗
==運(yùn)算符比較的是對象是否占有相同的內(nèi)存位置
-
-128~127之間的short, int被包裝到固定的對象中, 上面的比較就會成功
參數(shù)數(shù)量可變的方法
-
...: 是Java代碼的一部分, 表示這個方法可以接受任意數(shù)量的對象
public class PrintStream {public PrintStream printf(String fmt, Object... args){return format(fmt, args);} } -
printf方法接受兩個參數(shù), 一個是格式化字符串, 另一個是Object[]數(shù)組, 其中保存著所有其他參數(shù)(整數(shù)或者其他基本類型的值會自動裝箱為對象), Object...參數(shù)類型和Object[]完全一樣
枚舉類
- public enum Size { SMALL, MEDIUM, LARGE, EXTRA_LARG};
- 枚舉構(gòu)造器總是私有的
- 所有枚舉類型都是Enum的子類
- values: 返回一個包含全部枚舉值的數(shù)組
反射
- 反射: 能夠分析類能力的程序
Class類
- getClass: 返回類的名字
- forName: 獲得類名對應(yīng)的Class對象
- T.class: 代表匹配的類對象
- Class實際上是泛型類, Employee.class-->Class<Employee>
聲明異常入門
- 處理器處理拋出的異常
- 異常分為
- 非檢查型異常
- 檢查型異常
利用反射分析類的能力
- java.lang.reflect包中有三個類Field, Method, Constructor分別用于描述類的字段,方法和構(gòu)造器, 這三個類都有一個gteName方法, 返回其名稱
- Class類中的getFields, getMethods, getConstructors 方法返回這個類支持的公共字段,方法和構(gòu)造器的數(shù)組, 其中包括超類的公共成員
- Class類中的getDeclaredFields, getDeclareMethods, getDeclaredConstructors 方法返回這個類聲明的全部字段,方法和構(gòu)造器,包括私有成員,包成員,受保護(hù)成員,不包括超類成員
繼承的設(shè)計技巧
總結(jié)
以上是生活随笔為你收集整理的CoreJava 笔记总结-第五章 继承的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【算法】分治算法
- 下一篇: CoreJava 笔记总结-第六章 接口