在下面的代码中,b
和show
本身是静态的吗?
public class A {
public static class B {
private int b = 0;
public void show() {
System.out.println(b);
}
}
}
答案 0 :(得分:9)
不,他们不是static
。您需要创建B
的实例才能访问它们。
答案 1 :(得分:4)
代码示例中的static
关键字表示可以在没有A实例的情况下创建B的实例。
如果B
不是静态的:
A
。new B()
中使用A
,或使用new A().new B()
等语法。B
中的方法可以引用A.this
(对A
实例的隐式引用)。B
中的方法可以引用A.this.someField
(使用该隐式引用)。B
中的方法可以调用A
中的实例(非静态)方法。但是,因为B
是静态的:
A
实例的引用 - 您不需要A
来创建B
。new A.B()
(或new B()
内的A
来创建实例)B
中的方法无法引用A.this
。B
中的方法无法访问A中的字段(除非作为参数传入)。B
中的方法无法调用A
中的实例(非静态)方法。答案 2 :(得分:2)
它们不是静态的。它们是B中的实例字段
这意味着你需要有一个B的实例来获取/设置它们
B在A中是静态的,但是这不会使B的那些字段静止
您可以创建B的多个实例,而不引用A.
因此B是A中的静态类,但对于B的实例字段则不然。
答案 3 :(得分:1)
static关键字有两个含义实际上是完全不同的,可能会令人困惑。
变量/方法上的静态意味着它存在于类级别,而不是实例级别。这意味着无论您创建的类的实例数是多少,您只有该变量/方法的一个副本。
内部类上的静态虽然只是意味着该类不依赖于它的外部类。在您的示例中,您可以创建new B()
而无需A
。如果您在类上没有static关键字,则除非new B()
的实例位于A
内,否则无法创建{{1}}。
答案 4 :(得分:0)
B是A的静态内部类。 需要实例化B。
A.B innerObject = new A.B();
innerObject.show();
答案 5 :(得分:0)
标识符static
在这里有一个特定的目的,很多人都没有立即掌握。我将把你的代码改成一点。
public class A {
private int a;
public A(int a) {
this.a = a;
}
public class B {
public void show() {
System.out.println(a);
}
}
}
现在,班级B
发生了什么?由于B
是非静态类,因此它可以访问类A
中的其他非静态成员。本质上,它声明每个类A
对象都有自己的类B
对象的味道,甚至认为它们在功能上是相同的。如果B
是静态类,我们可以获得相同的行为:
public class A {
private int a;
public A(int a) {
this.a = a;
}
public int getA() { return a; }
public static class B {
public void show(A a) {
System.out.println(a.getA());
}
}
}
这意味着B
对象的风格不会根据创建它的A
对象而改变。 B
类是静态的,因此它无法访问创建它的A
类对象的非静态成员,并且必须从它想要与之交互的A
对象中显式访问这些成员。
在前面的实现中,B
对象将无缝访问创建它的A
对象的字段和非静态方法。
这是两种不同的行为,通常很清楚哪一种适合您的目标。