Java面向对象(七)包、内部类、垃圾回收机制
一、包
package 包名; ?---- 聲明包 ? ?注意: 一個(gè)java文件中只能有一句package語句 , ?并且必須放在java文件首行 。?
import 包名; --- 導(dǎo)包
import ?java.util.*; ? ?*是一個(gè)通配符,會(huì)匹配當(dāng)前包下所有的類,但不會(huì)包括子包下的類
java.lang --- 核心類庫,一個(gè)java程序運(yùn)行之前會(huì)先自動(dòng)把這個(gè)包下所有的類加載到方法區(qū)。 不需要手動(dòng) 導(dǎo)入。 (同包類也 不需要手動(dòng)導(dǎo)入)
java.util --- 工具包
java.io --- 用于傳輸數(shù)據(jù)
java.nio --- 用于處理高并發(fā)
java.net ---- 用于網(wǎng)絡(luò)通信
javax ---- java 擴(kuò)展包
java.sql --- 數(shù)據(jù)庫交互
org.* ---- 由第三方廠商和一些開源社區(qū)提供的包 。
注意: 在自定義包名時(shí) , 不能以java 、 javax 、 org開頭 , 否則jvm會(huì)去java原生類中尋找你自定義的類 , 這樣是永遠(yuǎn)也找不到的 。?
二、內(nèi)部類
內(nèi)部類是封裝的第三種形式(1. 函數(shù)、2. 屬性的私有化)
1. 方法內(nèi)部類
定義在方法內(nèi)的類。
方法內(nèi)部類中不能定義靜態(tài) 變量和方法,但允許定義靜態(tài)常量。
方法內(nèi)部類不能使用方法的變量,但能使用方法的常量。
方法內(nèi)部類可以使用外部類的屬性和方法。
方法內(nèi)部類可以繼承其他類
方法內(nèi)部類調(diào)用外部類的方法 : Outer.this.m() ;
除了當(dāng)前方法外 , 其他地方都不能使用這個(gè)方法內(nèi)部類 。?
內(nèi)部類會(huì)比外部類先加載 。?
2. 成員內(nèi)部類
定義在類內(nèi)方法外
利用外部類對(duì)象創(chuàng)建內(nèi)部類對(duì)象
Outer.Inner ? in = new outer().new Inner();
不能定義靜態(tài)方法和變量。 但可以定義靜態(tài)常量 。 ?
可以是用外部類的方法和屬性
具有成員屬性的特性: 可以被權(quán)限修飾符修飾 。?
3.靜態(tài)內(nèi)部類
用static修飾的成員內(nèi)部類
Outer.Inner in = new Outer.Inner();
可以定義靜態(tài)屬性和方法。
和普通類 基本沒有差別
4. 匿名內(nèi)部類
匿名內(nèi)部類本質(zhì)上就是繼承了這個(gè)類/實(shí)現(xiàn)了這個(gè)接口
Class c/*匿名內(nèi)部類創(chuàng)建的對(duì)象*/ = new Class(){
code;//匿名內(nèi)部類的實(shí)體 。
};
有構(gòu)造函數(shù),單數(shù)不能手動(dòng)定義。
定義在方法內(nèi)時(shí)需要注意的與方法內(nèi)部類一樣
定義在方法外時(shí),需要注意的與成員內(nèi)部類一樣。
匿名內(nèi)類中 必須要重寫 接口\類中的抽象方法 。?
只要一個(gè)類可以被繼承 , 就可以出現(xiàn)匿名內(nèi)部類的形式。?
構(gòu)造函數(shù)可以私有化 。 ?只是在類外不能被繼承 , 在類內(nèi)可以被內(nèi)部類繼承 。?
5. 內(nèi)部接口
定義在類中或接口中的接口默認(rèn)是靜態(tài)的。 理解: 在類定義時(shí)不能創(chuàng)建對(duì)象 ,要求內(nèi)部接口要能被直接訪問 , 所以要求內(nèi)部接口是靜態(tài)的 。
接口中可以定義 類,并且默認(rèn)是靜態(tài),因?yàn)榻涌诓荒軇?chuàng)建對(duì)象。 理解: 接口不能創(chuàng)建對(duì)象, ?所以要求內(nèi)部類能直接被訪問 。?
三、垃圾回收機(jī)制
1. 對(duì)象存儲(chǔ)在堆內(nèi)存中 , 垃圾回收針對(duì)堆內(nèi)存而言。
當(dāng)調(diào)用構(gòu)造方法的時(shí)候,創(chuàng)建對(duì)象,存在堆內(nèi)存中,因?yàn)?/span>java中對(duì)每種數(shù)據(jù)類型都明確的給定了大小,所以在創(chuàng)建對(duì)象的時(shí)候會(huì)自動(dòng)計(jì)算大小分配內(nèi)存(具體的數(shù)據(jù)都是由基本數(shù)據(jù)類型組成的)。所以在內(nèi)存的回收和釋放的時(shí)候也是由java自己管理。
對(duì)象在堆內(nèi)存中存儲(chǔ) , 在使用完成后不會(huì)被立即回收 ,而是在 不定時(shí)的某個(gè)時(shí)刻被垃圾回收機(jī)制(Grabage collector ---gc)回收 ? , 回收過程程序員不能手動(dòng)控制。?
2. 一個(gè)對(duì)象剛創(chuàng)建時(shí)是放在新生代的伊甸園區(qū),如果這個(gè)對(duì)象在棧內(nèi)存中沒有引用,那么會(huì)在掃描的時(shí)候被解析,釋放內(nèi)存;如果經(jīng)過一次掃描依然沒有釋放內(nèi)存,會(huì)將移入新生代的幸存區(qū),幸存區(qū)的掃描平率略低于伊甸園區(qū);如果幸存區(qū)經(jīng)過多次掃描依然沒有被釋放,會(huì)被放入老生代,老生代的掃描的頻率遠(yuǎn)低于新生代。老生代的對(duì)象一旦被回收,可能導(dǎo)致程序的卡頓或崩潰。
3. 在原生的java中新生代要大于老生代 ?, 但是在實(shí)際開發(fā)中為了提高效率 , ?往往會(huì)增大老生代 , 達(dá)到降低掃描頻率的目的 。?
4. 垃圾回收的線程優(yōu)先級(jí)是相當(dāng)相當(dāng)?shù)偷?。?
minor GC(Garbage Collage) 發(fā)生在新生代的回收 ---初代回收 ?
full GC 發(fā)生在老生帶的回收 ---完全回收
5. 在JDK1.6及以前 , ?java只把內(nèi)存分為四塊 : 棧 、 堆 、 本地方法棧 、 寄存器 。 而堆中又可以分為:新生代 、 老生代 、 永久帶 ?,JDK1.6之后 把堆中的永久帶獨(dú)立出來 形成方法區(qū)。 ?現(xiàn)在的內(nèi)存分塊: 棧 、 堆 、 方法區(qū) 、 本地方法棧 、 寄存器 ?。
總結(jié)
以上是生活随笔為你收集整理的Java面向对象(七)包、内部类、垃圾回收机制的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java面向对象(六)接口
- 下一篇: Java常用API(一)Object