Java 为什么我可以实例化一个静态的内部类?
如果我不能创建静态类的实例,为什么我可以实例化静态内部类 在下面的代码中,Counter是一个静态内部类,但可以将其实例化为:Java 为什么我可以实例化一个静态的内部类?,java,Java,如果我不能创建静态类的实例,为什么我可以实例化静态内部类 在下面的代码中,Counter是一个静态内部类,但可以将其实例化为: public class Task { static class Counter { int counter = 0; void increment() {counter++;} } public static void main(String[] args) { Counter counter
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);
}
}
如果计数器不是静态类,则可以使用以下sintax对其进行实例化:
Counter counter1 = new Task().new Counter();
Counter counter2 = new Task().new Counter();
但我无法在实际手段中找出这些方法之间的区别
在下面的代码中,Counter是一个静态内部类,但可以将其实例化为:
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);
}
}
可以实例化内部类(无论它是否是静态的
),就像普通类一样。使类成为静态类只允许您访问它,而不创建封闭类的实例。就像你在代码中做的那样:
Counter counter1 = new Task.Counter();
这里您正在创建计数器的实例。但是由于计数器
是一个嵌套类(我们称之为静态内部
类),因此我们必须这样访问它Task.Counter
是Counter
类的完全限定名(在此处添加包)。事实上,由于您的main
方法仅在Task
类中,因此您可以直接使用:
Counter counter1 = new Counter();
现在,对于内部类
(非静态),如果没有封闭类的任何实例,就无法访问该类。因此,要创建计数器
的实例,首先需要任务
的实例,如下所示:
Task task = new Task();
Counter counter = task.new Counter();
Counter counter = new Task().new Counter();
您可以将这些语句组合成以下语句:
Task task = new Task();
Counter counter = task.new Counter();
Counter counter = new Task().new Counter();
简单地说,区别在于,内部类
有一个对与其关联的封闭实例的引用,嵌套类
没有这样的引用。静态嵌套类无权访问嵌套类的非静态字段和方法。
非静态嵌套类(“内部类”)存在于嵌套类的实例中,因此它可以访问其非静态字段和方法。可能重复感谢,但我不同意,因为引用的问题解释了内部类和嵌套类之间的区别。我在问为什么我可以实例化一个静态的内部类,就好像它不是静态的一样。依我拙见,这不是一回事。但我尊重你的观点。这与即将调用thread.yield()
或thread.yield()
是一样的。谢谢,很好的解释。但是内部类和嵌套类不是同义词?@rperson No.静态内部类
通常只称为嵌套类
。而非静态内部
类只是称为内部类
。这只是一个术语问题。谢谢。@rperson不客气:)如果您想对内部类进行更详细的分析,可以通过