1. 程式人生 > 實用技巧 >內部類

內部類

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);

    }
}