Java中的静态类成员是静态的吗?

时间:2014-02-13 13:35:39

标签: java static

在下面的代码中,bshow本身是静态的吗?

public class A {
    public static class B {
        private int b = 0;
        public void show() {
            System.out.println(b);
        }
    }
}

6 个答案:

答案 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对象的字段和非静态方法。

这是两种不同的行为,通常很清楚哪一种适合您的目标。