2014-01-25 219 views
3

如果我不能创建一个静态类的实例,为什么我可以实例化一个静态内部类?为什么我可以实例化一个静态内部类?

在代码波纹管,计数器是一个静态内部类,但它可以被实例化为如果不是:

public class Task { 

    static class Counter { 
     int counter = 0; 
     void increment() {counter++;} 
    } 

    public static void main(String[] args) { 
     Counter counter1 = new Task.Counter(); 
     Counter counter2 = new Task.Counter(); 
     counter1.increment(); 
     counter2.increment(); 
     counter2.increment(); 
     counter2.increment(); 
     System.out.println("counter1: " + counter1.counter); 
     System.out.println("counter2: " + counter2.counter); 
    } 
} 

如果计数器不是一个静态类,它cound是使用以下sintax实例:

Counter counter1 = new Task().new Counter(); 
Counter counter2 = new Task().new Counter(); 

但我无法弄清楚这些方法在实际手段上的区别。

+0

[Java内部类和静态嵌套类]的可能重复(http://stackoverflow.com/questions/70324/java-inner-class-and-static-nested-class) – Mark

+0

谢谢,但我不同意,因为引用的问题解释了内部类和嵌套类之间的区别。我问为什么我可以实例化一个静态内部类,就好像它不是静态的。在我看来,这不是一回事。但我尊重你的观点。 – outlookrperson

+0

与即将调用'thread.yield()'或Thread.yield()' –

回答

4

在代码波纹管,计数器是一个静态内部类,但它可以被实例化为如果不是:

内部类(无论是static或不)可被实例化,只是就像一个普通的班级一样。创建一个类static只允许您在不创建封闭类的实例的情况下访问它。就像您在该代码中所做的一样:

Counter counter1 = new Task.Counter(); 

在这里您将创建Counter的实例。但由于Counter是嵌套类(我们称之为static inner类),所以我们必须像这样访问它。 Task.CounterCounter类的完全限定名(在此处添加包)。事实上,因为你main方法是仅在Task类,可以直接使用:

Counter counter1 = new Counter(); 

现在,对于inner class(非静态),你不能访问类没有封闭的任何实例类。因此,要创建Counter一个实例,你首先需要的Task一个实例,像这样:

Task task = new Task(); 
Counter counter = task.new Counter(); 

您可以将这些报表合并成一个像这样的:

Counter counter = new Task().new Counter(); 

在简单的话,所不同的是inner class有一个与它关联的封闭实例的引用,其中nested class没有这样的引用。

+0

谢谢,很好的解释。但内部类和嵌套类不是同义词? – outlookrperson

+0

@rperson编号'静态内部类'通常被称为'嵌套类'。而'非静态内部类'只是被称为'内部类'。 –

+0

我明白了。这只是一个术语问题。谢谢。 – outlookrperson

0

静态嵌套类不能访问它所嵌套类的非静态字段和方法。 嵌套类的实例中存在非静态嵌套类('内部类'),因此它可以访问其非静态字段和方法。

相关问题