內部類
阿新 • • 發佈:2020-07-01
Java內部類
一.內部類
內部類分為:
- 成員內部類
- 靜態內部類
- 區域性內部類
- 匿名內部類
內部類在編譯時也可以生成獨立的位元組碼(class)檔案;
內部類可以直接訪問外部類的私有成員,而不破壞封裝;
成員內部類
在類的內部定義,與例項變數,例項方法同級別的類
建立內部類物件時,必須依賴外部類的物件
- Outer out=new Outer()
- Inner in=out.new Inner()
當外部類,內部類存在重名的屬性時,會優先訪問內部類的屬性
package oop; public class Test { private String name="鄧文雄"; class Header { private String name="張三"; public void print() { System.out.println(name);//列印內部類的屬性 System.out.println(Test.this.name);//列印外部類的重名屬性 } } public static void main(String[] args) { Header s2=new Test().new Header();//建立內部類物件 s2.print(); } }
成員內部類不能定義靜態成員(可以定義靜態常量)
靜態內部類
不依賴外部類物件,可以直接建立或通過類名訪問,可宣告靜態成員,跟外部類同級;
只能直接訪問外部類的靜態成員(例項成員需要例項化外部類物件)
建立:
- Outer.Inner inner=new Outer.Inner()
區域性內部類
定義在外部類方法中,作用範圍和建立物件範圍僅限於當前方法;
區域性內部類訪問外部類當前方法中的區域性變數是,因無法保障變數的生命週期與自身相同,變數必須修飾為final
package oop; public class Test { private String name="的吧"; public void show(){ //定義區域性內部類 class Inner{ private int age =12; public void print(){ System.out.println(name); System.out.println(age); } } //建立區域性內部類物件 Inner s=new Inner(); s.print(); } public static void main(String[] args) { Test s2=new Test(); s2.show(); } }
匿名內部類
- 沒有類名的區域性內部類(一切特徵都與區域性內部類相同)
- 必須繼承一個父類或實現一個介面
Object類
所有類的父類
getclass()方法
返回引用中儲存的實際物件型別;通常用於判斷兩個引用中實際儲存物件型別是否一致;
hashCode()方法
返回該物件的雜湊碼值,地址
toString()方法
返回該物件的字串表示;可以重寫該方法
equals()方法
比較兩個物件的地址相不相同
finalize()方法
- 當物件被判斷為垃圾物件時,有JVM自動呼叫此方法,用以標記垃圾物件,進入回收佇列;
- 垃圾物件:沒有有效引用指向此物件時,為垃圾物件;
- 垃圾回收:由GC銷燬垃圾物件,釋放資料儲存空間。
- 自動回收機制:JVM的記憶體耗盡時,一次性回收所以垃圾物件
- 手動回收機制:使用System.gc();通知JVM執行垃圾回收
二.型別轉換與裝箱拆箱
package oop;
public class Test {
public static void main(String[] args) {
//型別轉換:裝箱;基本型別轉換為引用型別;
int num1=19;
//使用Integer建立物件
Integer integer1=new Integer(num1);
Integer integer2=Integer.valueOf(num1);
//型別轉換:拆箱;引用型別轉換為基本型別
Integer integer3=new Integer(100);
int num2=integer3.intValue();
//JDK1.5後的自動裝箱和拆箱
int num4=90;
Integer integer4=num4;
Integer integer5=new Integer(80);
int num5=integer5;
}
}
parse...()方法將字串轉換為基本型別
三.Integer資料緩衝區
package oop;
public class Test {
public static void main(String[] args) {
Integer integer1=new Integer(100);
Integer integer2=new Integer(100);
//false
System.out.println(integer1==integer2);
//當integer的值大於-128,小於127時,呼叫valueof進行自動裝箱,使用緩衝區進行;否則使用new Integer()進行自動裝箱
Integer integer3=100;
Integer integer4=100;
//true
System.out.println(integer3==integer4);
Integer integer5=128;
Integer integer6=128;
//false
System.out.println(integer5==integer6);
}
}