如何正确访问静态成员类?

时间:2008-09-17 19:20:06

标签: java static

我有两个类,并希望在另一个类中包含一个类的静态实例,并通过第一个类访问第二个类中的静态字段。

这样我可以使用相同名称的不同实例。

Class A 
{
    public static package1.Foo foo;
}

Class B 
{
    public static package2.Foo foo;
}


//package1
Foo 
{
    public final static int bar = 1;
}

// package2
Foo
{
    public final static int bar = 2;
}

// usage
assertEquals(A.foo.bar, 1);
assertEquals(B.foo.bar, 2);

这有效,但我收到警告“静态字段Foo.bar应以静态方式访问”。 有人可以解释为什么会这样,并提供“正确”的实施。

我意识到我可以直接访问静态实例,但如果你有一个很长的包层次结构,那就太丑了:

assertEquals(net.FooCorp.divisions.A.package.Foo.bar, 1);
assertEquals(net.FooCorp.divisions.B.package.Foo.bar, 2);

5 个答案:

答案 0 :(得分:10)

您应该使用:

Foo.bar

而不是:

A.foo.bar

这就是警告的含义。

原因是bar不是Foo实例的成员。相反,bar在班级Foo上是全球性的。编译器希望您全局引用它,而不是假装它是实例的成员。

答案 1 :(得分:2)

将这两个静态变量放入这些类中是没有意义的,只要您只需要访问静态成员即可。 编译器希望您通过类名前缀来访问它们,如:

package1.Foo.bar
package2.Foo.bar

答案 2 :(得分:2)

在:

中创建对象后
public static package1.Foo foo;

它不是以静态方式访问的。您必须使用类名,当然还有完整的包名来解决该类,因为它们在不同的包上具有相同的名称

答案 3 :(得分:1)

我同意其他人的意见,你可能会以错误的方式思考这个问题。如果您只访问静态成员,那么这可能对您有用:

public class A {
    public static class Foo extends package1.Foo {}
}
public class B {
    public static class Foo extends package2.Foo {}
}

答案 4 :(得分:0)

Foo实例可以访问Foo的静态字段,但请考虑“静态”这个词。这意味着“静态约束”,至少在这种情况下。由于A.foo属于Foo类型,“A.foo.bar”不会向对象询问“bar”,它将直接进入该类。这意味着即使子类有一个名为“bar”的静态字段,而foo是该子类的一个实例,它也会得到Foo.bar,而不是FooSubclass.bar。因此,通过类名引用它是一个更好的主意,因为如果你试图利用继承,你将会自己开枪。