1. 程式人生 > >匿名物件和內部類

匿名物件和內部類

匿名物件:

匿名物件是物件的簡化形式;

匿名物件的使用情況:

1)當對物件方法僅進行一次呼叫的時候使用;如果需要呼叫多次,還需要建立物件。如果對一個物件進行多個成員的呼叫,就必須給這個物件起個名字。

2)匿名物件可以作為實際引數進行傳遞(點選事件監聽裡面的引數)

3)匿名物件是沒有被其他物件所引用

4使用一次就變成垃圾了,被垃圾回收器收回了。

理解:

建立一個匿名物件,呼叫類中的方法   new People().say();

這裡需要傳遞一個監聽物件,我們直接給一個匿名物件;使用匿名物件,如果直接new介面要實現介面中的抽象方法(相當於 建立了一個子類物件,並實現其中的抽象方法)

          top_right_left_img.setOnClickListener(new View.OnClickListener() {
               @Override
               public void onClick(View v) {
               }
           });

           top_right_left_img.setOnClickListener(listener);
            View.OnClickListener listener = new View.OnClickListener() {
                @Override
                public void onClick(View v) {

                }
            };

內部類:

java內部類使用總結:

1)一個類中還包含著另外一個類,內部類有自己的屬性和方法。

2)程式編譯過後會產生兩個.class檔案。

3)內部類其實嚴重破壞了良好的程式碼結構,但為什麼還要使用內部類呢?因為內部類可以隨意使用外部類的成員變數(包括私有)而不用生成外部類的物件,這也是內部類的唯一優點。

常規用法:

1)建立內部類物件

2)內部類可以直接使用外部類的成員變數,在android 點選事件跳轉頁面中有用到,頁面之間傳遞引數

3)如果存在同名變數,訪問內部類本身的成員變數可用this.屬性名

4)如果存在同名變數,訪問外部類的成員變數需要使用Out.this.屬性名

5)如果用static 將內部內靜態化,那麼內部類就只能訪問外部類的靜態成員變數,具有侷限性

在變數前面加private 表示類的私有屬性,只可以在類內部訪問使用,即只能在本類中進行使用,也不能夠在子類中使用,子類只能繼承公有的成員變數和成員方法。

內部類中的變數訪問形式案例

package com.crs.demo.ui.innerclass;

/**
 * Created on 2016/9/26.
 * Author:crs
 * Description:內部類成員變數使用特點
 */
public class Demo2 {
    private int age = 12;

    class Inner {
        int age = 13;

        void print() {
            int age = 14;
            System.out.print(age + "\n");

            //2)如果存在同名變數,訪問內部類本身的成員變數可用this.屬性名
            System.out.print(this.age + "\n");

            //3)如果存在同名變數,訪問外部類的成員變數需要使用Out.this.屬性名
            System.out.print(Demo2.this.age + "\n");
        }
    }
}

package com.crs.demo.ui.innerclass;

/**
 * Created on 2016/9/26.
 * Author:crs
 * Description:靜態內部類的使用以及注意事項
 */
public class Demo3 {
    private int age = 16;
    private static int score = 16;

    static class Inner {
        //1)在變數前面加private 表示類的私有屬性,只可以在類內部訪問使用,即只能在本類中進行使用,也不能夠在子類中使用,子類只能繼承公有的成員變數和成員方法。
        //2)一定要區分好匿名物件與內部類的區別。
        public void print() {
            //4)如果用static 將內部內靜態化,那麼內部類就只能訪問外部類的靜態成員變數,具有侷限性.
            //System.out.print(age);會報錯。
            System.out.print(score);
        }
    }

}

package com.crs.demo.ui.innerclass;

/**
 * Created on 2016/9/26.
 * Author:crs
 * Description:測試內部類的使用
 */
public class TestInnerClass {
    public static void main(String[] args) {
        Demo1 demo1 = new Demo1();
        //建立內部類物件
        Demo1.Inner inner = demo1.new Inner();
        inner.print();

        //主要用於測試內部類的變數訪問形式
        Demo2 demo2 = new Demo2();
        Demo2.Inner inner1 = demo2.new Inner();
        inner1.print();

        //測試靜態內部類的使用
        Demo3.Inner inner3= new Demo3.Inner();
        inner3.print();
    }
}