Java學習周記week03
一.繼承
1.什麽叫繼承?
繼承是面向對象的三大特征之一。
在程序中,繼承描述的是類與類之間的關系,通過繼承多個類之間形成一種關系體系。
在Java中,類的繼承是指在一個現有類的基礎上去構建一個新的類,構建出的類被稱作子類,現有的類被稱作父類。
繼承後子類的特點: 子類自動擁有父類所有可繼承的屬性和方法。
在程序中,如果想聲明一個類繼承另一個類,需要使用extends關鍵字。
2.繼承的註意事項
(1)繼承必須合理(子類必須屬於父類的一種時,符合is a 法則時,才會繼承)
(2)父類中成員是共性的內容(父類抽取出了共性的內容,子類可以在父類基礎上擴展新的屬性和行為)
(3)子類自動擁有父類的成員並且可以直接使用非私有的父類成員
3.子類中訪問父類成員變量特點
如果父類中的成員變量是非私有的,那麽子類可以直接訪問。
如果出現了成員變量同名的情況,在程序中使用子類對象會自動調用子類的成員變量,如果想調用父類的成員變量,需要使用super關鍵字。
4.子類中訪問父類成員方法特點
當程序通過對象調用方法時,會先在子類中查找是否有對應方法,如果有的話就執行子類中的方法,如果沒有的話就會執行父類中的對應方法。
在子類中,訪問父類中的成員方法格式:
super.父類中的成員方法();
5.繼承特點
1.Java只支持單繼承:就一個子類 只能最多直接繼承一個父類。(Java不支持多繼承)
2.Java支持多層繼承。
3.父類定義了繼承樹中共性內容,子類定義了該類個性內容。
6.繼承中方法的重寫與應用
子父類成員方法特殊情況——覆蓋
子類中出現與父類一模一樣的方法時,會出現覆蓋操作,也稱為override重寫、復寫或者覆蓋。
當子類需要父類的功能,而功能主體子類有自己特有內容時,可以重寫父類中的方法,這樣,即沿襲了父類的功能,又定義了子類特有的內容。
7.方法重寫的註意事項
-
子類方法覆蓋/重寫/覆寫(override)父類方法,必須要保證權限大於等於父類權限。
-
如果父類的方法是private的修飾的,那麽在子類中沒法重寫(其他修飾符都可以重寫)。
-
寫法上稍微註意:必須一模一樣:方法的返回值類型 方法名 參數列表都要一樣。
總結:當一個類是另一個類中的一種時,可以通過繼承,來繼承屬性與功能。如果父類具備的功能內容需要子類特殊定義時,進行方法重寫。
二. 抽象類
1.抽象方法的產生與定義
分析事物時,發現了共性內容,就出現向上抽取。會有這樣一種特殊情況,就是方法功能聲明相同,但方法功能主體不同。那麽這時也可以抽取,但只抽取方法聲明,不抽取方法主體。那麽此方法就是一個抽象方法。
當定義了抽象函數的類也必須被abstract關鍵字修飾,被abstract關鍵字修飾的類是抽象類。
1 抽象方法定義的格式: 2 public abstract 返回值類型 方法名(參數); 3 4 抽象類定義的格式: 5 abstract class 類名 { 6 }
2.抽象方法的使用
抽象類無法直接創建對象,只能被子類繼承後,創建子類對象。
三.接口
1.接口的概念
類:具有相同屬性和功能的事物集合
接口是功能的集合,同樣可看做是一種數據類型,是比抽象類更為抽象的”類”。
接口只描述所應該具備的方法,並沒有具體實現,具體的實現由接口的實現類(相當於接口的子類)來完成。這樣將功能的定義與實現分離,優化了程序設計。
一切事物均有功能,即一切事物均有接口。
2.接口的定義
與定義類的class不同,接口定義時需要使用interface關鍵字。
定義接口所在的仍為.java文件,雖然聲明時使用的為interface關鍵字的編譯後仍然會產生.class文件。這點可以讓我們將接口看做是一種只包含了功能聲明的特殊類。
1 public interface 接口名 { 2 抽象方法1; 3 抽象方法2; 4 抽象方法3; 5 }
3.實現類接口
類與接口的關系為實現關系,即類實現接口。實現的動作類似繼承,只是關鍵字不同,實現使用implements。
class 實現類 implements 接口 { 重寫接口中所有方法 }
在類實現接口後,該類就會將接口中的抽象方法繼承過來,此時該類需要重寫該抽象方法,完成具體的邏輯。
4.接口中成員的特點
1、接口中可以定義成員變量,但是變量必須有固定的修飾符修飾,public static final 所以接口中的變量也稱之為常量,其值不能改變。後面我們會講解static與final關鍵字
2、接口中可以定義方法,方法也有固定的修飾符,public abstract
3、接口不可以創建對象。
4、實現類必須覆蓋掉接口中所有的抽象方法後,實現類才可以實例化。否則實現類是一個抽象類。
5.接口特點
接口可以繼承接口。
如同類繼承類後便擁有了父類的成員,可以使用父類的非私有成員。A接口繼承B接口後,A接口便擁有了A、B兩個接口中所有的抽象方法。
Java支持一個類同時實現多個接口,或一個接口同時繼承多個接口。
類可以在繼承一個類的同時,實現多個接口。
接口與父類的功能可以重復,均代表要具備某種功能,並不沖突。
6.抽象類與接口的比較
相同點:
都位於繼承的頂端,用於被其他類實現或繼承;
都不能直接實例化對象;
都可以包含抽象方法,其子類都必須覆寫這些抽象方法;
區別:
抽象類為部分方法提供實現,避免子類重復實現這些方法,提高代碼重用性;
接口只能包含抽象方法;
一個類只能繼承一個直接父類(可能是抽象類),卻可以實現多個接口;(接口彌補了Java的單繼承)
抽象類為繼承體系中的共性內容,接口為繼承體系外的擴展功能
二者的選用:
優先選用接口,盡量少用抽象類;
需要定義子類的行為,又要為子類提供共性功能時才選用抽象類;
四.多態
1.多態的概念
多態是繼封裝、繼承之後,面向對象的第三大特性。
父類引用變量可以指向子類對象。
多態的前提是必須有子父類關系或者類實現接口關系,否則無法完成多態。
在使用多態後的父類引用變量調用方法時,會調用子類重寫後的方法。
2.多態的代碼體現
父類類型 變量名 = new 子類類型();
此時,雖然該變量指向的是子類對象,但表現為一個父類的形態,可以調用一切父類的方法,子類特有的方法將不能調用。
3.多態調用註意事項
成員變量編譯看父類中是否存在,不存在編譯失敗
成員變量運行父類中的變量
成員方法編譯看父類中是否存在,不存在編譯失敗
成員方法運行子類重寫的方法
4.多態的好處和弊端
多態的存在意義(優點)為:配合繼承與方法重寫提高了代碼的復用性與擴展性,如果沒有方法重寫,則多態同樣沒有意義。
多態的弊端: 不能調用子類的特有方法。
5.向上轉型與向下轉型
向上轉型:當有子類對象賦值給一個父類引用時,便是向上轉型,多態本身就是向上轉型的過程。
向上轉型的使用格式
1 父類類型 變量名 = new 子類類型(); 2 如:Animal p = new Cat();
向下轉型:一個已經向上轉型的子類對象可以使用強制類型轉換的格式,將父類引用轉為子類引用,這個過程是向下轉型。如果是直接創建父類對象,是無法向下轉型的!
向下轉型的使用格式
1 子類類型 變量名 = (子類類型) 父類類型的變量; 2 如:Cat c = (Cat) a; //變量p 實際上指向Cat對象
instanceof關鍵字
判斷對象是否可以向下轉型 返回值為boolean
1 boolean b = 引用變量 instanceof 類; 2 if(a instanceof Dog){ 3 Dog d = (Dog)a; 4 }
五.static關鍵字
1.static概念
static它是靜態修飾符,一般用來修飾類中的成員。
2.static 的特點
static是靜態修飾符,一般修飾成員。被static修飾的成員屬於類,不屬於單個對象。
static修飾的成員被多個對象共享。
static修飾的成員屬於類,但是會影響每一個對象。
被static修飾的成員又叫類成員,不叫對象的成員。
3.static修飾成員的使用
被static修飾的成員可以並且建議通過類名直接訪問。也可以通過某個對象訪到屬於類的靜態成員,原因即多個對象均屬於一個類,共享使用同一個靜態成員。
格式:
類名.靜態成員變量名
類名.靜態成員方法名(參數)
對象名.靜態成員變量名 ------不建議,出現警告
對象名.靜態成員方法名(參數) ------不建議,出現警告
1 class Demo { 2 //非靜態成員變量 3 public int num1 = 100; 4 //靜態成員變量 5 public static int num2 = 100; 6 7 //非靜態方法 8 public void method(){ 9 System.out.println("靜態方法"); 10 } 11 //靜態方法 12 public static void method(){ 13 System.out.println("靜態方法"); 14 } 15 16 } 17 class Test { 18 public static void main(String[] args) { 19 System.out.println(Demo.num); 20 Demo.method(); 21 } 22 }
4.靜態代碼快
靜態代碼塊是定義在成員位置,使用static修飾的代碼塊。
特點:
在同一個類中,它優先於主方法執行、優先於構造代碼塊執行,當以任意形式第一次使用到該類時執行。
該類不管創建多少對象,靜態代碼塊只執行一次。
可用於給靜態變量賦值,用來給類進行初始化。//數據庫JDBC
1 public class Person { 2 private String name; 3 private int age; 4 //靜態代碼塊 5 static{ 6 System.out.println("靜態代碼塊執行了"); 7 }
六.final關鍵字
1.final關鍵字的概念
繼承的出現提高了代碼的復用性,並方便開發。但隨之也有問題,有些類在描述完之後,不想被繼承,或者有些類中的部分方法功能是固定的,不想讓子類重寫。這個時候就要使用到final關鍵字。
2.final關鍵字的特點
-
final修飾類不可以被繼承,但是可以繼承其他類。
-
final修飾的方法不可以被覆蓋,但父類中沒有被final修飾方法,子類覆蓋後可以加final。
-
final修飾的變量稱為常量,這些變量只能賦值一次。
-
引用類型的變量值為對象地址值,地址值不能更改,但是地址內的對象屬性值可以修改。
-
修飾成員變量,需要在創建對象前賦值,否則報錯。
-
也可以成員變量不賦值,但是構造方法必須賦值
七.四種訪問權限修飾符
public | protected | default | private | |
同一類中 | 可調用 | 可調用 | 可調用 | 可調用 |
同一包中 | 可調用 | 可調用 | 可調用 | |
不同包中 | 可調用 | 可調用 | ||
不同包中的無關類 | 可調用 |
-
要想僅能在本類中訪問使用private修飾;
-
要想本包中的類都可以訪問不加修飾符即可;
-
要想本包中的類與其他包中的子類可以訪問使用protected修飾
-
要想所有包中的所有類都可以訪問使用public修飾。
- 如果類用public修飾,則類名必須與文件名相同。一個文件中只能有一個public修飾的類
八.內部類
1.內部類的概念
將類寫在其他類的內部,可以寫在其他類的成員位置和局部位置,這時寫在其他類內部的類就稱為內部類。其他類也稱為外部類。
訪問方式
外部類名.內部類名 變量名 = new 外部類名().new 內部類名();
2.匿名內部類
內部類是為了應對更為復雜的類間關系。
最常用到的內部類就是匿名內部類,它是局部內部類的一種。
定義的匿名內部類有兩個含義:
- 臨時定義某一指定類型的子類。
- 定義後即刻創建剛剛定義的這個子類的對象。
格式
1 new 父類或接口(){ 2 //進行方法重寫 3 };
九.Object類
Object類是Java語言中的根類,即所有類的父類。它中描述的所有方法子類都可以使用。所有類在創建對象的時候,最終找的父類就是Object。
兩個常用方法1.equals 2.toString
開發中經常重寫這兩個方法,讓這兩個方法更符合開發時的使用。
1. equals(Object);方法,用於比較兩個對象是否相同,它其實就是比較兩個對象的地址值是否相同。
2.toString();方法,就是返回該對象的字符串表示,其字符串內容是對象的類型[email protected]+內存地址值。
十.異常
1.異常的概念
在Java等面向對象的編程語言中,異常本身是一個類,產生異常就是創建異常對象並拋出了一個異常對象。Java處理異常的方式是中斷處理。
2.異常的分類
異常和錯誤的根類是Throwable,異常類皆繼承java.lang.Throwable;
旗下有兩個子類,Error與Exception。
- 嚴重錯誤Error:無法通過處理的錯誤。
- 編譯時異常Exception,編譯時無法通過。
- 運行時異常RuntimeException,是Excption的子類,運行時可能會報錯,可以不處理。
3.異常的基本操作
- 創建異常對象
- 對異常的基本操作有兩種
- 拋出異常
- 捕獲異常(使用try/catch做分支處理)
聲明拋出處理,出現異常後不處理,聲明拋出給調用者處理。
方法聲明上加throws 異常類名
註意:異常處理,指處理的一種可能性,即有了異常處理的代碼,不一定會產生異常。如果沒有產生異常,則代碼正常執行,如果產生了異常,則中斷當前執行代碼,執行異常處理代碼。
拋出異常 throw(動詞,表示拋出異常的動作)
使用格式:
throw new 異常類名(參數);
聲明異常 throws(將異常標識出來,報告給調用者我這個方法可能會出現這種異常)
聲明異常格式:
修飾符 返回值類型 方法名(參數) throws 異常類名1,異常類名2… { }
4.捕獲異常 try…catch…finally
捕獲:Java中對異常有針對性的語句進行捕獲,可以對出現的異常進行指定方式的處理
捕獲異常格式:
1 try { 2 3 //需要被檢測的語句。 4 5 } 6 7 catch(異常類 變量) { //參數。 8 9 //異常的處理語句。 10 11 } 12 13 finally { 14 15 //一定會被執行的語句。 16 17 }
try:該代碼塊中編寫可能產生異常的代碼。
catch:用來進行某種異常的捕獲,實現對捕獲到的異常進行處理。
finally:有一些特定的代碼無論異常是否發生,都需要執行。另外,因為異常會引發程序跳轉,導致有些語句執行不到。而finally就是解決這個問題的,在finally代碼塊中存放的代碼都是一定會被執行的。
5.異常的註意事項
- 多異常處理
捕獲處理:
- 多個異常分別處理
- 多個異常一次捕獲多次處理
- 多個異常一次捕獲一次處理
聲明拋出異常:
聲明上使用,一次聲明多個異常
- 運行時異常被拋出可以不處理。即不捕獲也不聲明拋出
- 如果父類方法拋出了多個異常,子類覆蓋父類方法時,只能拋出相同的異常或者是他的子集
- 父類方法沒有拋出異常,子類覆蓋父類該方法時也不可拋出異常。此時子類產生該異常,只能捕獲處理,不能聲明拋出[多線程會用到這個]
- 當多異常處理時,捕獲處理,前邊的類不能是後邊類的父類
- 在try/catch後可以追加finally代碼塊,其中的代碼一定會被執行,通常用於資源回收。
十一.常用API
1.Date類
類 Date 表示特定的瞬間,精確到毫秒。
繼續查閱Date類的描述,發現Date擁有多個構造函數,只是部分已經過時,但是其中有未過時的構造函數可以把毫秒值轉成日期對象。
- Date(); 獲取一個當前日期對象
- Date(long date); 獲取一個距離標準基準時間 date毫秒數的日期對象。
- Date方法默認調用了toString對象
- long getTime(返回一個自標準基準時間以來的此Date對象表示的毫秒數);
2.DateFormat
DateFormat 是日期/時間格式化子類的抽象類,它以與語言無關的方式格式化並解析日期或時間。日期/時間格式化子類(如 SimpleDateFormat類)允許進行格式化(也就是日期 -> 文本)、解析(文本-> 日期)和標準化。
我們通過這個類可以幫我們完成日期和文本之間的轉換。
DateFormat類的作用:即可以將一個Date對象轉換為一個符合指定格式的字符串,也可以將一個符合指定格式的字符串轉為一個Date對象。
1 代碼演示: 2 //創建日期格式化對象,在獲取格式化對象時可以指定風格 3 DateFormat df= new SimpleDateFormat("yyyy-MM-dd");//對日期進行格式化 4 Date date = new Date(1607616000000L); 5 String str_time = df.format(date); 6 System.out.println(str_time);//2020年12月11日
指定格式的具體規則我們可參照SimpleDateFormat類的說明,這裏做簡單介紹,規則是在一個字符串中,會將以下字母替換成對應時間組成部分,剩余內容原樣輸出:
- 當出現
y
時,會將y替換成年
- 當出現
M
時,會將M替換成月
- 當出現
d
時,會將d替換成日
- 當出現
H
時,會將H替換成時
- 當出現
m
時,會將m替換成分
- 當出現
s
時,會將s替換成秒
DateFormat的兩個常用方法
1.format(Date date);將一個Date格式化為日期/時間字符串。
2.parse(String source); 從給定字符串的開始解析文本,以生成一個日期。
format方法,用來將Date對象轉換成String
parse方法,用來將String轉換成Date(轉換時,該String要符合指定格式,否則不能轉換)。
2.calendar類
Calendar是日歷類,在Date後出現,替換掉了許多Date的方法。該類將所有可能用到的時間信息封裝為靜態成員變量,方便獲取。
Calendar為抽象類,由於語言敏感性,Calendar類在創建對象時並非直接創建,而是通過靜態方法創建,將語言敏感內容處理好,再返回子類對象。
Calendar類靜態方法
getInstance(); 使用一個默認時區和語言環境獲得一個日歷
Calendar c = Calendar.getInstance(); //返回當前日歷對象
Calendar類常用方法
- add(int field , int mount); 為給定的日歷字段添加或減去指定的時間量
- get(int field); 返回給定日歷字段的值
- getInstance(); 使用默認時區和語言環境獲得一個日歷
- getTime(); 返回一個表示此Calendar時間值的Date對象
- set(int field, int mount);將給定的日歷字段設置為給定值
YEAR 年
MONTH 月,從0開始算起,最大11;0代表1月,11代表12月。
DATE 天
HOUR 時
MINUTE分
SECOND秒
註意事項
西方星期的開始為周日,中國為周一。
在Calendar類中,月份的表示是以0-11代表1-12月。
日期是有大小關系的,時間靠後,時間越大。
3.System類
在API中System類介紹的比較簡單,我們給出定義,System中代表程序所在系統,提供了對應的一些系統屬性信息,和系統操作。
查看文檔System類不能手動創建對象,因為構造方法被private修飾,阻止外界創建對象。System類中的都是static方法,類名訪問即可。在JDK中,有許多這樣的類。
常用方法
static long currentTimeMillis(); 返回以毫秒值為單位的當前時間。
static void exit(int status); 終止當前正在運行的Java虛擬機(0記為正常狀態,其他為異常狀態)
static void gc(); 運行垃圾回收(並沒有什麽卵用)
static String getProperty(String key); 獲取指定鍵的系統屬性
4.Math類
Math
類是包含用於執行基本數學運算的方法的數學工具類,如初等指數、對數、平方根和三角函數。
類似這樣的工具類,其所有方法均為靜態方法,並且一般不會創建對象。如System類
static double abs(double a); 返回double值的絕對值
static double ceil(double a); 向上取整
static double floor(double a);向下取整
static double max(double a , double b); 返回較大值
static double min(double a ,double b); 返回較小值
static double pow(double a , double b); 返回 a的b次冪的值
static double random(); 返回一個隨機的大於等於0.0且小於1.0的double 值
static long round(double a ); 四舍五入
5.基本類型包裝類
java將基本數據類型值封裝成了對象。
其中需要註意int對應的是Integer,char對應的Character,其他6個都是基本類型首字母大寫即可。
parseXXX(String s);其中XXX表示基本類型,參數為可以轉成基本類型的字符串,如果字符串無法轉成基本類型,將會發生數字轉換的問題NumberFormatException
在需要的情況下,基本類型與包裝類型可以通用。有些時候我們必須使用引用數據類型時,可以傳入基本數據類型。
自動拆箱:對象轉成基本數值
自動裝箱:基本數值轉成對象
6.正則表達式
正則表達式(英語:Regular Expression,在代碼中常簡寫為regex)。
正則表達式是一個字符串,使用單個字符串來描述、用來定義匹配規則,匹配一系列符合某個句法規則的字符串。在開發中,正則表達式通常被用來檢索、替換那些符合某個規則的文本。
常用方法
1.matches(String regex); 判斷字符串是否匹配給定的規則
2.split(String regex);根據給定正則表達式的匹配規則,拆分此字符串
十一.集合
數組的長度是固定的。集合的長度是可變的。
數組中存儲的是同一類型的元素,可以存儲基本數據類型值。
集合存儲的都是對象。而且對象的類型可以不一致。
Collection接口是集合中的頂層接口,它中定義的所有功能子類都可以使用。查閱API中描述的Collection接口。Collection 層次結構 中的根接口。Collection 用來存儲一組對象,這些對象也稱為 collection 的元素。一些 collection 允許有重復的元素,而另一些則不允許。
1.Collection接口的基本方法
boolean add(E e); 添加對象,並判斷是否刪除成功 (増)
void clear(); 刪除集合中的所有成員 (刪)
boolean contains(Object o); 判斷集合中是否包含o(查)
boolean remove(Object o); 刪除對象,並判斷是否刪除成功 (刪)
int size(); 返回collection的元素數(查)
Object[] toArray(); 返回包含此collection中所有元素的數組
2.Iterator 叠代器
java中提供了很多個集合,它們在存儲元素時,采用的存儲方式不同。我們要取出這些集合中的元素,可通過一種通用的獲取方式來完成。
Collection集合元素的通用獲取方式:在取元素之前先要判斷集合中有沒有元素,如果有,就把這個元素取出來,繼續在判斷,如果還有就再取出出來。一直把集合中的所有元素全部取出。這種取出方式專業術語稱為叠代。
常用方法
boolean hasNext(); 如果仍有元素可以叠代,則返回true,說明可以叠代。
E next(); 返回叠代的下一個元素,並把指針向後移動一位。
1 //1,創建集合對象。 2 Collection<String> coll = new ArrayList<String>(); 3 coll.add("abc1"); 4 coll.add("abc2"); 5 coll.add("abc3"); 6 coll.add("abc4"); 7 8 //2.獲取容器的叠代器對象。通過iterator方法。 9 Iterator it = coll.iterator(); 10 11 //3,使用具體的叠代器對象獲取集合中的元素。參閱叠代器的方法 12 while(it.hasNext()){ 13 System.out.println(it.next()); 14 } 15 16 /* 17 叠代器for循環的形式的使用 18 for (Iterator it = coll.iterator(); it.hasNext(); ) { 19 System.out.println(it.next()); 20 } 21 */
叠代的常規用法中我們要盡量避免在叠代過程中為集合添加/刪除數據。否則會報錯,原因是Java拋出了並發修改異常。
叠代過程中並發修改異常的原因為:
叠代器中”記憶”的集合長度與集合中實際長度不同,而導致出現索引與實際元素不符甚至無限循環的情況發生。
3.增強for循環
增強for循環是JDK1.5以後出來的一個高級for循環,專門用來遍歷數組和集合的。它的內部原理其實是個Iterator叠代器,所以在遍歷的過程中,不能對集合中的元素進行增刪操作。
格式:
for(元素的數據類型 變量 : Collection集合or數組){
}
它用於遍歷Collection和數組。通常只進行遍歷元素,不要在遍歷的過程中對集合元素進行增刪操作。
增強for循環和老式的for循環有什麽區別?
註意:新for循環必須有被遍歷的目標。目標只能是Collection或者是數組。
建議:遍歷數組時,如果僅為遍歷,可以使用增強for如果要對數組的元素進行 操作,使用老式for循環可以通過角標操作。
十二.泛型
泛型:就是一種不確定的類型(JDK1.5的一個新特性)
基本體現: <E>這就是泛型 可以是任意類型
- 泛型用來靈活地將數據類型應用到不同的類、方法、接口當中。將數據類型作為參數傳遞。
- 泛型是數據類型的一部分,將類名與泛型合並一起看做數據類型。
- 泛型的定義:定義泛型可以在類中預支地使用未知的類型。
- 泛型的使用:一般在創建對象時,將未知的類型確定具體的類型。當沒有指定泛型時,默認類型為Object類型。
1.使用泛型的好處
- 將運行時期的ClassCastException,轉移到了編譯時期變成了編譯失敗。
- 避免了類型強轉的麻煩。
2.含有泛型的類:泛型類
定義格式:修飾符 class 類名<代表泛型的變量> { }
使用格式:創建對象時,確定泛型的類型
3.含有泛型的方法
定義格式:修飾符 <代表泛型的變量> 返回值類型 方法名(參數){ }
使用格式:調用方法時,確定泛型的類型
4.含有泛型的接口
定義格式:修飾符 interface接口名<代表泛型的變量> { }
使用格式:
1、實現接口時,確定泛型的類型
2、實現接口,不指定泛型的類型,直到創建對象時,確定泛型的類型
5.泛型通配符
當使用泛型類或者接口時,傳遞的數據中,泛型類型不確定,可以通過通配符<?>表示。但是一旦使用泛型的通配符後,只能使用Object類中的共性方法,集合中元素自身方法無法使用。
定義:(查看ArrayList的構造方法或者addAll方法)無法在類中使用
使用:調用方法時可以給予任意類型。參照Arraylist的構造方法或者addAll方法
? extends E代表只要是E類型的子類即可
? super E代表只要是E類型的父類即可
Java學習周記week03