面向?qū)ο筮M(jìn)階的第三天
內(nèi)部類(lèi)
內(nèi)部類(lèi)是什么?
類(lèi)的5大成分(成員變量、成員方法、構(gòu)造器、代碼塊、內(nèi)部類(lèi))之一
類(lèi)中的類(lèi)
使用場(chǎng)景
當(dāng)一個(gè)事物的內(nèi)部,還有一個(gè)部分需要一個(gè)完整的結(jié)構(gòu)進(jìn)行描述時(shí)。
內(nèi)部類(lèi)有幾種
1、靜態(tài)內(nèi)部類(lèi)
是什么?有static修飾,屬于外部類(lèi)本身。
特點(diǎn):只是位置在類(lèi)里面。類(lèi)有的成分它都有。
創(chuàng)建對(duì)象:
外部類(lèi).內(nèi)部類(lèi)名 ?對(duì)象名 ?= new 外部類(lèi)名.內(nèi)部類(lèi)構(gòu)造器;拓展
1、靜態(tài)內(nèi)部類(lèi)可以直接訪問(wèn)外部類(lèi)的靜態(tài)成員嗎? 可以的
2、靜態(tài)內(nèi)部類(lèi)中是否可以直接訪問(wèn)外部類(lèi)的實(shí)例成員? 不可以的
2、成員內(nèi)部類(lèi)(實(shí)例內(nèi)部類(lèi))
無(wú)static修飾,屬于外部類(lèi)的對(duì)象的。
是什么?
特點(diǎn):JDK 16中類(lèi)有的成分,它都有。
創(chuàng)建對(duì)象 :
外部類(lèi).內(nèi)部類(lèi) ?對(duì)象名 ? = ?new 外部類(lèi)構(gòu)造器.new ?內(nèi)部類(lèi)構(gòu)造器;拓展
1、成員內(nèi)部類(lèi)中是否可以直接訪問(wèn)外部類(lèi)的靜態(tài)成員? 可以
2、成員內(nèi)部類(lèi)的實(shí)例方法中是否可以直接訪問(wèn)外部類(lèi)的實(shí)例成員? 可以
3、局部?jī)?nèi)部類(lèi)
定義在方法,代碼塊,構(gòu)造器中,執(zhí)行代碼處的類(lèi)。雞肋語(yǔ)法!
4、匿名內(nèi)部類(lèi)(重點(diǎn))
使用匿名內(nèi)部類(lèi)的好處:
格式:
new ?類(lèi)名|接口|抽象類(lèi)(){ ? ? ?
? ?方法重寫(xiě); ? ? ?
}特點(diǎn):
匿名內(nèi)部類(lèi)是一個(gè)沒(méi)有名字的局部?jī)?nèi)部類(lèi),本身也是一個(gè)所謂的子類(lèi)對(duì)象。
匿名內(nèi)部類(lèi)產(chǎn)生的對(duì)象類(lèi)型,相當(dāng)于是當(dāng)前new的那個(gè)的類(lèi)型的子類(lèi)類(lèi)型。
方便構(gòu)建子類(lèi)對(duì)象,最終目的:簡(jiǎn)化代碼
枚舉
是什么? 是一種特殊類(lèi)型。?枚舉的特征:
枚舉類(lèi)都是繼承了枚舉類(lèi)型:java.lang.Enum
枚舉都是最終類(lèi),不可以被繼承。
構(gòu)造器都是私有的,枚舉對(duì)外不能創(chuàng)建對(duì)象。
枚舉類(lèi)的第一行默認(rèn)都是羅列枚舉對(duì)象的名稱(chēng)的。
枚舉類(lèi)相當(dāng)于是多例模式。
泛型
認(rèn)識(shí)泛型
定義類(lèi)、接口、方法時(shí),同時(shí)聲明了一個(gè)或者多個(gè)類(lèi)型變量(如:<E>) ,稱(chēng)為泛型類(lèi)、泛型接口,泛型方法、它們統(tǒng)稱(chēng)為泛型。
作用
泛型提供了在編譯階段約束所能操作的數(shù)據(jù)類(lèi)型,并自動(dòng)進(jìn)行檢查的能力!這樣可以避免強(qiáng)制類(lèi)型轉(zhuǎn)換,及其可能出現(xiàn)的異常。
泛型類(lèi)
定義類(lèi)的同時(shí)定義了泛型的類(lèi)就是泛型類(lèi)
泛型類(lèi)的格式
修飾符 class 類(lèi)名<類(lèi)型變量,類(lèi)型變量,…> {
}作用
在編譯階段可以指定能操作的數(shù)據(jù)的類(lèi)型
原理
把出現(xiàn)泛型變量的地方全部替換成傳輸?shù)恼鎸?shí)數(shù)據(jù)類(lèi)型。
泛型接口
使用了泛型定義的接口就是泛型接口
格式
修飾符 interface 接口名稱(chēng)<泛型變量> {
}作用
泛型接口可以讓實(shí)現(xiàn)類(lèi)選擇當(dāng)前功能需要操作的數(shù)據(jù)類(lèi)型
原理
實(shí)現(xiàn)類(lèi)可以在實(shí)現(xiàn)接口的時(shí)候傳入自己操作的數(shù)據(jù)類(lèi)型,這樣重寫(xiě)的方法都將是針對(duì)于該類(lèi)型的操作。
泛型方法
定義方法時(shí)同時(shí)定義了泛型的方法就是泛型方法
格式
修飾符 <類(lèi)型變量,類(lèi)型變量,…> ?返回值類(lèi)型 方法名(形參列表) ?{
}作用
方法中可以使用泛型接收一切實(shí)際類(lèi)型的參數(shù),方法更具備通用性。
原理
把出現(xiàn)泛型變量的地方全部替換成傳輸?shù)恼鎸?shí)數(shù)據(jù)類(lèi)型。
泛型通配符、上下限
? 可以在“使用泛型”的時(shí)候代表一切類(lèi)型。
E T K V 是在定義泛型的時(shí)候使用的。
泛型的上下限
? extends Car: ?必須是Car或者其子類(lèi) 泛型上限
? super Car : ?必須是Car或者其父類(lèi) 泛型下限
泛型的注意事項(xiàng):擦除問(wèn)題、基本數(shù)據(jù)類(lèi)型問(wèn)題
泛型是工作在編譯階段的,一旦程序編譯成class文件,class文件中就不存在泛型了,這就是泛型擦除。
泛型不支持基本數(shù)據(jù)類(lèi)型,只能支持對(duì)象類(lèi)型(引用數(shù)據(jù)類(lèi)型)。
java.lang包下常用API
API概述
API全稱(chēng)是應(yīng)用程序編程接口,是Java寫(xiě)好的程序,程序員可以直接調(diào)用。
Object類(lèi):toString方法
Object是祖宗類(lèi),它里面的方法,一切子類(lèi)對(duì)象都可以使用。
public String toString()
默認(rèn)是返回當(dāng)前對(duì)象的地址信息。
Student s = new Student("張三",'女', 23);
System.out.println(s.toString());
返回對(duì)象地址
System.out.println(s);
直接輸出對(duì)象名,默認(rèn)是調(diào)用toString方法的
toString存在的意義:
默認(rèn)返回對(duì)象的地址其實(shí)是沒(méi)有意義的
真實(shí)存在的意義是被子類(lèi)重寫(xiě),以便返回子類(lèi)對(duì)象的內(nèi)容。
Object類(lèi):equals方法
public boolean equals(Object o )
默認(rèn)是比較2個(gè)對(duì)象的地址是否一樣,返回true 或者false
equals存在的意義
默認(rèn)比較對(duì)象的地址其實(shí)是沒(méi)有意義的,因?yàn)?= 號(hào)可以更簡(jiǎn)單的完成
存在的的真實(shí)意義是被子類(lèi)重寫(xiě),以便比較對(duì)象的內(nèi)容。
protected Object clone()
當(dāng)某個(gè)對(duì)象調(diào)用這個(gè)方法時(shí),這個(gè)方法會(huì)復(fù)制一個(gè)一模一樣的新對(duì)象返回。
分類(lèi):
淺克?。嚎截惓龅男聦?duì)象,與原對(duì)象中的數(shù)據(jù)一模一樣(引用類(lèi)型拷貝的只是地址)
深克?。?/span>
對(duì)象中基本類(lèi)型的數(shù)據(jù)直接拷貝。
對(duì)象中的字符串?dāng)?shù)據(jù)拷貝的還是地址。
對(duì)象中還包含的其他對(duì)象,不會(huì)拷貝地址,會(huì)創(chuàng)建新對(duì)象。
Objects
Objects是一個(gè)工具類(lèi),提供了更安全的方式比較2個(gè)對(duì)象。
Student s = null;
s.equals(s2); 空指針異常
Objects.equals(s, s2); 返回false
Objects常見(jiàn)方法:
方法名說(shuō)明public static boolean equals(Object a, Object b)比較兩個(gè)對(duì)象的,底層會(huì)先進(jìn)行非空判斷,從而可以避免空指針異常。再進(jìn)行equals比較public static boolean isNull(Object obj)判斷變量是否為null ,為null返回true ,反之返回false
包裝類(lèi)
其實(shí)就是8種基本數(shù)據(jù)類(lèi)型對(duì)應(yīng)的引用類(lèi)型。
作用:實(shí)現(xiàn)一切皆對(duì)象
包裝類(lèi)的分類(lèi):
基本數(shù)據(jù)類(lèi)型引用數(shù)據(jù)類(lèi)型byteByteshortShortintIntegerlongLongcharCharacterfloatFloatdoubleDoublebooleanBoolean
包裝類(lèi)其實(shí)可以隨便用的:int integer
自動(dòng)裝箱
基本類(lèi)型的數(shù)據(jù)可以賦值其給包裝類(lèi)
自動(dòng)拆箱
包裝類(lèi)的數(shù)據(jù)賦值給基本數(shù)據(jù)類(lèi)型
包裝類(lèi)的特有功能:
1、基本類(lèi)型變成字符串
// 1、調(diào)用包裝類(lèi)繼承自O(shè)bject的toString方法String rs1 = it6.toString(); // "23"System.out.println(rs1 + 1); // 231// 2、調(diào)用靜態(tài)方法: public static String toString(int i)String rs2 = Integer.toString(it6);// "23"System.out.println(rs2 + 1);// 3、直接加 “”String rs3 = it6 + ""; // "23"System.out.println(rs3 + 1);
?
2、把字符串變成基本數(shù)據(jù)類(lèi)型(重點(diǎn))
String age = "23";// int ageInt = Integer.parseInt(age);int ageInt = Integer.valueOf(age); System.out.println(ageInt + 1); String price = "98.5";// double priceDb = Double.parseDouble(price);double priceDb = Double.valueOf(price); System.out.println(priceDb + 0.5);