Java 如何正确访问静态成员类?
我有两个类,希望在另一个类中包含一个类的静态实例,并通过第一个类从第二个类访问静态字段 这样我就可以拥有同名的不相同实例Java 如何正确访问静态成员类?,java,static,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 f
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);
你应使用:
Foo.bar
而不是:
A.foo.bar
这就是警告的意思
原因是
bar
不是Foo
实例的成员。相反,bar
是全局的,在类Foo
上。编译器希望您全局引用它,而不是假装它是实例的成员。只要您只需要访问静态成员,就没有意义将这两个静态变量放在这些类中。
编译器希望您通过类名前缀访问它们,如:
package1.Foo.bar
package2.Foo.bar
在中创建对象后:
public static package1.Foo foo;
它不是以静态方式访问的。您必须使用类名,当然还有完整的包名来寻址该类,因为它们在不同的包上具有相同的名称的确,一个Foo实例可以访问Foo的静态字段,但请考虑“static”一词。它的意思是“静态绑定”,至少在本例中是这样。由于A.foo是foo类型,“A.foo.bar”不会向对象请求“bar”,而是直接进入类。这意味着,即使一个子类有一个名为“bar”的静态字段,并且foo是该子类的一个实例,它也会得到foo.bar,而不是foosublass.bar。因此,用类名引用它是一个更好的主意,因为如果你试图利用继承的优势,你会自食其果。我同意其他人的看法,你可能用错误的方式思考这个问题。这样,如果您只访问静态成员,这可能对您有效:
public class A {
public static class Foo extends package1.Foo {}
}
public class B {
public static class Foo extends package2.Foo {}
}
他的用例需要
导入包1.Foo;进口包装2.Foo代码>,这是非法的,因为它使Foo变得模棱两可。谢谢,这就是实现它的方法,即使它不是“java方式”。我知道这是可能的,因为我可以创建静态的内部类,它不会给出错误,但这将是一个维护噩梦,因此理所当然地不鼓励这样做。