3.6 Java內部類四種型別

weixin_33749242發表於2016-11-04

在Java中,內部類有四種不同的型別。這篇文章用四個簡單的例子來闡明它們。

1.靜態巢狀類

class Outer {
    static class Inner {
        void go() {
            System.out.println("Inner class reference is: " + this);
        }
    }
}
 
public class Test {
    public static void main(String[] args) {
        Outer.Inner n = new Outer.Inner();
        n.go();
    }
}

輸出:
Inner class reference is: Outer$Inner@19e7ce87

2.成員內部類

成員類是特定於例項的。 它可以訪問所有的方法,欄位和其他的外部類的引用。

public class Outer {
    private int x = 100;
 
    public void makeInner(){
        Inner in = new Inner();
        in.seeOuter();
    }
 
    class Inner{
        public void seeOuter(){
            System.out.println("Outer x is " + x);
            System.out.println("Inner class reference is " + this);
            System.out.println("Outer class reference is " + Outer.this);
        }
    }
 
    public static void main(String [] args){
        Outer o = new Outer();
        Inner i = o.new Inner();
        i.seeOuter();
    }
}

輸出:

Outer x is 100
Inner class reference is Outer$Inner@4dfd9726
Outer class reference is Outer@43ce67ca

3.方法內部類

public class Outer {
    private String x = "outer";
 
    public void doStuff() {
        class MyInner {
            public void seeOuter() {
                System.out.println("x is " + x);
            }
        }
 
        MyInner i = new MyInner();
        i.seeOuter();
    }
 
    public static void main(String[] args) {
        Outer o = new Outer();
        o.doStuff();
    }
}

輸出:

x is outer
public class Outer {
    private static String x = "static outer";
 
    public static void doStuff() {
        class MyInner {
            public void seeOuter() {
                System.out.println("x is " + x);
            }
        }
 
        MyInner i = new MyInner();
        i.seeOuter();
    }
 
    public static void main(String[] args) {
        Outer.doStuff();
    }
}

4.匿名內部類

當你在一個GUI程式中,為一個widget新增一個動作監聽器的時候常被用到。

button.addActionListener(new ActionListener(){
     public void actionPerformed(ActionEvent e){
         comp.setText("Button has been clicked");
     }
});

相關文章