面向对象4(匿名对象、内部类、包、修饰符、代码块)
1.匿名對象
指在創建對象的時候,只有創建語句,沒將對象地址賦值給某個變量
new Person();
1.1 特點
1、創建時,可直接使用,沒有變量名
new Person().eat();
2、匿名對象在未指定其引用變量時,只可使用一次
new Person().eat();
new Person().eat();
再次調用eat(),需重新創建一個Person對象。
3、可作為方法接收的參數,方法返回值使用
return new Person();
Demo.method(new Person());
1.2 應用場景
1、方法只調用一次時;
2、作為參數進行傳遞時(無法在傳參之前進行賦值等操作)。
2. 內部類
可寫在其他類(外部類)的成員位置和局部位置。
內部類可訪問外部類的成員,包括私有成員。
2.1 成員內部類
定義在外部類的成員位置,可用修飾類成員的修飾符修飾。
- 若用private,則無法再其他類中被訪問
- 其余限定修飾符都可以。
- 若由static修飾
- 可用外部類名直接創建內部類的對象
- 外部類名.內部類名? 變量名=new? 外部類名.內部類名();
- 外部類名.內部類名.方法名();(前提是內部類的此方法也用static修飾)
- abstract final也可修飾,不多用
可通過外部類的對象進行訪問。
class 外部類{
? ? ?? 修飾符 ? class ? 內部類{
? ? ? }
}
內部類無法被別的類看到,訪問時需用全名。
訪問:
外部類名.內部類名 ? 變量名=new 外部類名.new 內部類()
要調用內部類的成員,需先創建外部類的對象,再用? .? 調用。
?
?
2.2 局部內部類
定義在外部類方法中的局部位置
可通過調用方法進行訪問
class ? 外部類{
? ? ? 修飾符 ? 返回值 ? 方法名(參數){
? ? ? ? ? ? ? ? class? 內部類{
? ? ? ? ? ? ? ? }
? ? ?? }
}
局部內部類在聲明之后才可訪問。
訪問:
在外部類的方法中,創建內部類對象,進行訪問:
public class Party{public void puffBall() {class Ball{public void puff() {System.out.println("氣球漲了");}}new Ball().puff();}public static void main(String[] args) {Party p=new Party();p.puffBall();} }運行結果:
2.3匿名內部類
無名字的局部內部類,是局部內部類的一種。
意義:
臨時興義某一指定類型的子類;
定以后即刻創建此類的對象
作用:
1、是創建某個類子類對象的快捷方式
new 父類或接口(){
? ? ? ? ? //方法重寫(子類 或者接口的實現類)
};
2、匿名內部類的對象,賦值給它的父類(向上轉型)
使用匿名對象,將定義子類與創建子類對象兩個步驟有一個格式一次性完成。
匿名內部類若不定義變量引用,則也是匿名對象
new Person() {public void eat() {System.out.println("吃飯了");} }.eat();2.4 總結
內部類讓然是一個獨立的類,編譯后會被編譯成獨立的.class文件,但前面會加上外部類的類名和$符號。
內部類不能用普通的方式訪問,它是外部類的一個成員,它可自由訪問外部類的任何成員。
成員內部類可以以導入形式訪問:import? ...外部類名.內部類名。或外部類名.內部類名。
3. 包
宗旨:把.java文件(java源文件)、.class文件(編譯后的文件)以及其他resource文件(例如,.xml文件,.avi文件、.mp3文件、.txt文件等)有條理地進行一個組織,以供使用。
兩個作用:
項目的分工也是以包為邊界
類中聲明的包必須與實際的class文件所在的文件夾情況相一致,否則程序運行時會找不到類
包名全部采用小寫,多層包之間用 . 連接
類中包的聲明格式為:package? 包名.包名...包名;
聲明包的句子必須放在有效代碼的第一行
在訪問類的時候,為了能夠找到該類,必須使用含有包名的類全名(包名.類名):java.util.Scanner;
若在java.lang包中,可省略包名
同一個包下,訪問時可省略包名
不同包,只可訪問public修飾的類
導入包:import 包名.類名;
*:代表的是通配符,import java.util.*代表導入util下的所有類,但是未導入util子包中的類
不同包之間的類相互訪問:
- 使用類的全名
- 使用關鍵字import導入包
4. 修飾符
4.1 哪些修飾符可修飾哪些部分
| 是否可修飾 | 類 | 成員變量 | 成員方法 | 構造方法 |
| public | √ | √ | √ | √ |
| default | √ | √ | √ | √ |
| protected | 無意義 | √ | √ | √ |
| private | 別類不可用,無意義 | √ | √ | √(不可創建象) |
| abstract | √ | 無 | √(無方法體) | 要初始化對象 |
| static(成員) | ? | ? | √ | 創建對象時調用,不用類名調用 |
| final | √(不可被繼承) | √(常量) | √(不可重寫) | ? |
常見規則:
- 用public 修飾類
- 用private修飾成員變量,有get、set方法
- 用public 修飾方法
- 用public修飾構造方法(單例模式的構造方法為私有)
4.2 訪問修飾符
| ? | 同一類中 | 同一包中(子類與無關類) | 不同包的子類 | 不同包中的無關類 |
| public | √ | √ | √ | √ |
| protected | √ | √ | √ | ? |
| default | √ | √ | ? | ? |
| private | √ | ? | ? | ? |
- 僅在本類中訪問,用private
- 本包中的類,default
- 本包中的類和其他包中的子類,protected
- 所有包中的所有類,public
若類用public修飾,則類名必須與文件名相同。
一個文件中只能有一個用public修飾的類。
可以對類或類中的成員(字段以及方法) 加上訪問修飾符。
- 類可見表示其它類可以用這個類創建實例對象。
- 成員可見表示其它類可以用這個類的實例對象訪問到該成員;
如果子類的方法重寫了父類的方法,那么子類中該方法的訪問級別不允許低于父類的訪問級別。
- 這是為了確保可以使用父類實例的地方都可以使用子類實例,也就是確保滿足里氏替換原則。?
5. 代碼塊
局部代碼塊定義在方法或語句中
只需關注作用域
5.1 構造代碼塊
定義在類中成員位置
特點:
1、優先于構造方法執行
構造代碼塊用于執行所有度一向均需要的初始化動作
2、每創建一個對象均會執行一次構造代碼塊
5.2 靜態代碼塊
定義在成員位置,使用static修飾的
特點:
1、優先于主方法執行
優先于構造代碼塊執行
當以任意形式第一次執行該類的時候執行
2、該類不管創建愛你多少個對象,靜態代碼塊只執行一次
3、可用于給靜態變量賦值,用來給類進行初始化、
5.3 類
用到時再加載
加載時,會執行靜態代碼塊(一次)
再執行main()方法
再在構建對象new時,執行構造代碼塊以及構造方法
?
?
?
?
總結
以上是生活随笔為你收集整理的面向对象4(匿名对象、内部类、包、修饰符、代码块)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 面向对象3(final、static、i
- 下一篇: 常用API-1(Object类、Stri