第六章 面向?qū)ο螅ㄏ拢?/h2>

包裝類

  • 通過包裝類將八種基本類型的值包裝成對象使用
  • 自動裝箱:把基本類型變量賦給對應包裝類變量
  • 自動拆箱:把包裝類變量賦給對應基本類型變量
  • 自動裝箱拆箱必須類型匹配,賦給Object是利用了向上轉(zhuǎn)型特性
  • 包裝類的parseXxx(String s)方法和Xxx(String s)構造器將字符串轉(zhuǎn)換成基本類型
  • String類重載valueOf()方法將基本類型轉(zhuǎn)換成字符串
  • 包裝類實例可以與數(shù)值類型的值比較
  • 兩個包裝類引用指向同一個對象時才相等
  • 包裝類的compare(xxx val1, xxx val2)方法比較基本類型值大小,布爾值true>false

處理對象

  • syso打印會自動toString(),可用于對象的自我描述,所有類都可以重寫toString()
  • 引用變量指向同一對象時==才會true
  • ==只能用于比較有繼承關系的兩個對象
  • new String("hello");共產(chǎn)生兩個字符串對象
  • jvm使用常量池保存"hello"
  • 調(diào)用String構造器創(chuàng)建新對象,新"hello"被保存在堆內(nèi)存
  • jvm常量池保證相同字符串常量只有一個
  • String的equal()已經(jīng)重寫了,字符序列相同返回true
  • 默認Object的equal()只是比較地址,需要時可重寫提供自定義相等標準
  • if(obj!=null && obj.getClass()==Person.class)當obj是Person對象時

類成員

  • static不能修飾構造器
  • null對象可以訪問類成員,因為會在底層轉(zhuǎn)換為類去訪問
  • 單例類,只能創(chuàng)建一個對象,private修飾構造器,public static方法作為類的訪問點,static成員變量保存層創(chuàng)建的對象

final

  • final可修飾類、變量、方法
  • 修飾成員變量,必須顯示指定初始值,不能重新賦值
  • 類變量:靜態(tài)初始化塊或聲明時指定初始值
  • 實例變量:非靜態(tài)初始化塊、構造器或聲明時指定
  • 修飾局部變量,只能賦值一次,final修飾的形參不能在代碼塊里賦值
  • 修飾引用變量時不能改變的是地址,對象可以改變
  • 直接量,變量其實不存在,編譯時宏替換
  • final修飾變量
  • 定義時確定初始值
  • 初始值編譯時能確定
  • final修飾的方法不能被重寫
  • private final同時修飾重寫其實是創(chuàng)建新方法
  • final修飾類不能被繼承
  • 不可變類:創(chuàng)建實例后,其實例變量不可改變
  • 創(chuàng)建不可變類:
  • private final修飾成員變量
  • 帶參數(shù)構造器用來初始化成員變量
  • 不能提供setter方法
  • 有必要時重寫hashCode()和equals(),保證equals()相等時haahCode()也相等
  • 類的引用變量實例改變時屬于可變類,在構造器和getter方法中使用創(chuàng)建新對象的方法實現(xiàn)真正不可變類
  • Integer的valueOf緩存,范圍導致不在范圍的不被緩存,能緩存的同值對象則返回同一地址

抽象類

  • 抽象方法abstract修飾,不能有方法體,圓括號后一個分號
  • 有抽象方法的類必須定義成抽象類,抽象類里可以沒有抽象方法
  • 抽象類不能被實例化,只能被繼承
  • 抽象類的構造器不能用于創(chuàng)建實例,只能被子類調(diào)用
  • 抽象類更好發(fā)揮多態(tài)優(yōu)勢,父類變量調(diào)用子類實現(xiàn)后的抽象方法時無須轉(zhuǎn)換為子類類型
  • abstract和final不共存
  • abstract和static不能同時修飾方法,可以同時修飾內(nèi)部類
  • abstract和private不能同時修飾方法
  • 模板模式,車速表
  • 抽象父類抽象不能實現(xiàn)的方法
  • 父類定義通用算法,其它依賴于子類去實現(xiàn)

接口

  • public/default interface修飾,public修飾時與源文件同名
  • 接口只能繼承接口,多繼承
  • 成員可以是靜態(tài)常量、抽象方法、內(nèi)部類、接口、枚舉、默認方法和類方法
  • 接口所有成員都是public訪問權限,可省略
  • 系統(tǒng)自動為靜態(tài)常量增加public static final
  • 抽象方法自動修飾為public abstract
  • 默認方法必須用default修飾,不能用static,自動public修飾
  • 類方法必須用static修飾,不能用default,子的錢public修飾
  • 內(nèi)部類、內(nèi)部接口、內(nèi)部枚舉自動oublic static
  • 實現(xiàn)類可實現(xiàn)多個接口,implements,必須實現(xiàn)接口的所有抽象方法,否則需要定義成抽象類
  • 實現(xiàn)抽象方法時注意加上public
  • 接口引用變量可以直接賦給Object引用變量
  • 簡單工廠模式


  • 命令模式


內(nèi)部類

  • 作用
  • 提供更好的封裝,不允許其他類訪問
  • 直接訪問所在外部類的私有數(shù)據(jù)
  • 匿名內(nèi)部類創(chuàng)建只需要使用一次的類
  • 內(nèi)部類多可用private、protected、static修飾符
  • 非靜態(tài)內(nèi)部類不能擁有靜態(tài)成員
  • 內(nèi)部類也會生成.class文件OuterClass$InnerClass.class
  • 非靜態(tài)內(nèi)部類內(nèi)可直接訪問外部類的private成員
  • 非靜態(tài)內(nèi)部類的對象里會保存它所寄生的外部類對象的引用
  • 覆蓋的成員變量可以用OuterClass.this.、this.作區(qū)分
  • 外部類不能直接使用非靜態(tài)內(nèi)部類成員,必須顯式創(chuàng)建對象來調(diào)用
  • 外部類的靜態(tài)成員不能直接使用非靜態(tài)內(nèi)部類
  • 非靜態(tài)內(nèi)部類中不能定義靜態(tài)成員
  • 靜態(tài)內(nèi)部類可以包含靜態(tài)成員,也可以包含非靜態(tài)成員
  • 靜態(tài)內(nèi)部類內(nèi)部不能訪問外部類的實例成員,只能訪問外部類的類成員,因為靜態(tài)內(nèi)部類持有外部類的引用,沒有外部類對象的引用
  • 外部類不能直接訪問靜態(tài)內(nèi)部類的成員,可以用內(nèi)部類的類名作調(diào)用者來訪問
  • 接口內(nèi)可以定義內(nèi)部類,默認用public static修飾
    所以接口的內(nèi)部類只能是public訪問權限并且是靜態(tài)的
  • 在外部類以外的地方創(chuàng)建內(nèi)部類引用變量:PackageName.OuterClass.InnerClass varName
    需要完整的類名
  • 在外部類以外的地方創(chuàng)建非靜態(tài)內(nèi)部類之前需要先創(chuàng)建外部類對象,在用外部類的實例作調(diào)用者調(diào)用內(nèi)部類構造器new Out().new In();
  • 創(chuàng)建非靜態(tài)內(nèi)部類的子類的時候要保證子類構造器能夠調(diào)用內(nèi)部類的構造器,也就是必須存在一個外部類對象,參數(shù)傳進子類構造器,out.super();調(diào)用內(nèi)部類構造器
  • 內(nèi)部類子類對象一樣需要保留其父類所在外部類對象的引用
  • 創(chuàng)建靜態(tài)內(nèi)部類對象時無須創(chuàng)建外部類對象,因為它是類相關的,只需要把類名寫全調(diào)用內(nèi)部類構造器就可以了
  • 使用靜態(tài)內(nèi)部類只需要把外部類看做包空間,比較簡單,程序需要時,優(yōu)先考慮靜態(tài)內(nèi)部類
  • 不存在子類繼承外部類去重寫內(nèi)部類,因為內(nèi)部類類名還由外部類類名組合構成,不可能做到兩個類的內(nèi)部類是一樣的名字,所以不能重寫
  • 局部內(nèi)部類不能使用訪問修飾符,因為一定不能被其他類訪問
  • 創(chuàng)建匿名內(nèi)部類時會立即創(chuàng)建一個該類的實例,類定義立即消失
  • 匿名內(nèi)部類必須繼承一個父類,或?qū)崿F(xiàn)一個接口
    new 實現(xiàn)接口()|父類構造器(實參列表){內(nèi)部類實體部分}
  • 匿名內(nèi)部類不能是抽象類,因為會隨即創(chuàng)建對象
  • 匿名內(nèi)部類不能定義構造器,因為沒有類名
  • 通過父類繼承創(chuàng)建的匿名內(nèi)部類會擁有和父類相同形參列表的構造器
  • 如果局部變量被匿名內(nèi)部類訪問,變量就需要用final修飾,不能重復賦值
  • Lambda簡化創(chuàng)建只有一個抽象方法的接口(函數(shù)式接口)的實例
  • (形參列表)->{代碼塊}
  • 如果只有一條語句,可以省略花括號,如果有返回值且只有一條語句,可以省略return關鍵字,會自動返回唯一語句的值
  • 允許省略形參類型,如果形參只有一個,可以省略圓括號
  • 函數(shù)式接口可以包含多個默認方法、類方法,但只能有一個抽象方法
  • Lambda表達式結果被當成對象,所以可以賦值,只能為函數(shù)式接口創(chuàng)建對象,也可以通過函數(shù)式接口強制類型轉(zhuǎn)換,再賦值
  • Lambda實現(xiàn)的匿名方法的形參列表必須和函數(shù)式接口的唯一抽象方法形參列表相同
  • 如果Lambda表達式中只有一條語句,可以使用方法引用和構造器引用


  • Lambda表達式可以直接訪問final局部變量和外部成員變量
  • 匿名內(nèi)部類可以為任意接口、抽象類、普通類創(chuàng)建實例,Lambda只能是函數(shù)式接口
  • Lambda限制代碼塊不能調(diào)用接口中定義的默認方法,匿名內(nèi)部類可以

枚舉類

  • 一個java源文件最多定義一個public enum,且源文件名與枚舉類類名相同
  • enun默認繼承java.lang.Enum,未繼承Object類,不能顯式繼承其他類
  • 非抽象enun默認用final修飾,不能派生子類
  • 枚舉類構造器默認private修飾,且只能private 修飾
  • 所有實例在第一行列出 否則永遠不能產(chǎn)生實例,自動public static final修飾
  • 訪問枚舉類某實例:EnumClass.variable
  • switch語句的表達式可以是枚舉值
  • values()方法返回枚舉類的所有實例
  • 枚舉類通常應該設計成不可變類,成員變量用private final修飾,在構造器中指定初始值,列出枚舉類實例時傳入?yún)?shù):枚舉值("實參"),……
  • 實現(xiàn)接口的枚舉類可以讓每個枚舉值分別去實現(xiàn)抽象方法,枚舉值("實參"){...抽象方法(){}...}
  • 抽象枚舉類不用final修飾,用abstract修飾
  • 實現(xiàn)接口的枚舉值實際上是枚舉類的匿名子類的實例
  • 定義了抽象方法的枚舉類不能用abstract修飾,因為枚舉類需要顯式創(chuàng)建枚舉值,而不是父類,定義每個枚舉值時必須實現(xiàn)抽象方法

對象與垃圾回收

  • 垃圾回收機制只負責回收堆內(nèi)存中的對象
  • 程序無法控制垃圾回收的運行,只能控制對象不被引用,不能控制何時被回收
  • 垃圾回收機制回收對象之前會調(diào)用finalize()方法,該方法可能使讓對象復活,讓一個新的引用變量引用該對象,導致垃圾回收機制取消
  • 對象的三種狀態(tài)
  • 可達狀態(tài) 有一個或一個以上引用變量引用它
  • 可恢復狀態(tài) 沒有引用變量引用,開始調(diào)用finalize()方法
  • 不可達狀態(tài) 沒有引用,finalize()也已經(jīng)調(diào)用
  • 被其他類的類變量引用的對象,只有類被銷毀,對象才會進入可恢復狀態(tài)
  • 被其他對象的實例變量引用的對象,只有當對象被銷毀,才進入可恢復狀態(tài)
  • 強制系統(tǒng)垃圾回收(只是通知)
  • System.gc() System類的靜態(tài)方法gc()
  • Runtime.getRuntime().gc() Runtime對象的實例方法gc()
  • java命令的-verbose:gc可以看到每次垃圾回收后的提示信息
  • finalize()方法返回后,對象消失,垃圾回收機制開始執(zhí)行
  • 永遠不要主動調(diào)用某對象的finalize()方法,應該交給垃圾回收機制去調(diào)用
  • finalize()何時被調(diào)用、是否被調(diào)用具有不確定性
  • JVM執(zhí)行finalize()出現(xiàn)異常時,垃圾回收機制不會報告異常,程序繼續(xù)執(zhí)行
  • 因為finalize()不一定會被調(diào)用,所以想清理某個類里打開的資源時,不要放在finalize()里
  • 引用類型
  • 強引用,最常見的普通引用方式
  • 軟引用,通過SoftReference類來實現(xiàn),對于只有軟引用的對象來說,當系統(tǒng)內(nèi)存空間不足時,系統(tǒng)可能會回收它,軟引用通常用于對內(nèi)存敏感的程序中
  • 弱引用,通過WeakReference類來實現(xiàn),對于只有弱引用的對象,當垃圾回收機制運行時,不管系統(tǒng)內(nèi)存空間是否足夠,總會回收其所占內(nèi)存
  • 虛引用,通過PhantomReference類來實現(xiàn),完全類似于沒有引用,主要用于跟蹤對象被垃圾回收的狀態(tài),不能單獨使用,必須和引用隊列(ReferenceQueue)聯(lián)合使用
  • 三種引用類都有get()方法,用于獲取被他們所引用的對象(虛引用獲取不到)
  • 聯(lián)合使用軟引用、弱引用和引用隊列時,在對象回收之后,將把對應引用添加到關聯(lián)的引用隊列。虛引用則是在回收之前添加,使得可以在回收之前采取行動
  • 程序可以通過檢查與虛引用關聯(lián)的引用隊列中是否包含該虛引用,從而了解對象的狀態(tài)
  • 從軟、弱引用中取出被引用的對象時,可能該對象已經(jīng)被釋放了

修飾符的適用范圍

  • strictfp用來精確浮點
  • native修飾方法引入C語言實現(xiàn),會失去跨平臺性
  • 4個訪問控制符互斥
  • abstract final不共存
  • abstract static不能同時修飾方法,可以同時修飾內(nèi)部類
  • abstract private不能同時修飾方法,可以同時修飾內(nèi)部類
  • private final同時修飾方法合理但無意義
最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容