1. 程式人生 > >java程式設計之內部類

java程式設計之內部類

內部類的介紹

定義在另外一個類中的類,叫內部類

成員內部類

  1. .new 建立成員內部類必須先建立外部類的例項,然後通過.new 建立內部類的物件
  2. .this 可以通過外部類的類名.this去訪問外部類的所有屬性和方法。
public class Test1 {

    String name = "asnd";

    public static void main(String[] args) {

        Test1 test1 = new Test1();
        Inner mInner = test1.new Inner();
        mInner.print();
    }

    void
show() { System.out.println("show"); } public class Inner { String name = "123"; private void print(){ show(); System.out.println(name);//列印的是123 System.out.println(Test1.this.name);//列印的是asnd } } }

匿名內部類

沒有名字的類,建立類的同時,也會建立一個物件。
只需要用到一次的類,就可以使用匿名內部類

        File file = new File("D:/cc.txt") {

            @Override
            public boolean delete() {
                System.out.println("是否刪除y/n");
                Scanner input = new Scanner(System.in);
                String str = input.next();
                if (str.equals("y")) {
                    return
super.delete(); } System.out.println("刪除失敗"); return false; } }; file.delete(); }

匿名物件

該物件只需要訪問一次.

new Thread() {

            @Override
            public void run() {
                System.out.println("執行緒開始!");
                try {
                    Thread.sleep(2000);
                    System.out.println("執行緒結束!");
                } catch (Exception e) {
                    e.printStackTrace();
                }
                super.run();
            }

        }.start();

靜態內部類

  1. 靜態內部類只能訪問外部類靜態的方法和變數,不能訪問非靜態。
  2. 靜態內部類可以不需要建立外部類的引用,而直接建立。

匿名內部類訪問區域性變數

內部類訪問區域性變數必須final,如果沒有加,jdk1.8預設加上去了

當所使用的變數是在變的時候可以用下面的方法,也可以把下面的i在開始的時候定為靜態的

for (int i = 0; i < 5; i++) {
            final int finali = i;
            new Thread() {
                public void run() {
                    System.out.println(finali);
                };
            }.start();

        }

下面介紹一下內部類的實現技巧

public static void main(String[] args) {
        Lam mLam = new Lam();
        //第一種實現的方法
        mLam.to(new Ligh() {
            @Override
            public void shin() {
                System.out.println("on的第一種方法");
            }
        });
        //第二種實現方法
        class MyLam implements Ligh{

            @Override
            public void shin() {
                System.out.println("第二種");

            }}

        mLam.to(new MyLam());
    }
}

interface Ligh {
    void shin();
}

class Lam {
    public void to(Ligh ligh) {
        ligh.shin();
        System.out.println("on");
    }
}