题
我有两个课程,并要包括一个静态的实例一种类内的其他和访问静态的领域,从第二级通过的第一个。
是这样我可以有不同的实例中,与相同的名称。
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。酒吧应该去访问,在一个静态的方式"。有人能解释这是为什么,并提供"正确"的执行情况。
我意识到我可以访问静态的实例直接的,但是如果你有一个长期的包层次,即获取丑:
assertEquals(net.FooCorp.divisions.A.package.Foo.bar, 1);
assertEquals(net.FooCorp.divisions.B.package.Foo.bar, 2);
解决方案
我同意其他人,你可能思考这个错误的方式。用这种方式,这可以为你工作如果仅访问静态的成员:
public class A {
public static class Foo extends package1.Foo {}
}
public class B {
public static class Foo extends package2.Foo {}
}
其他提示
你应该使用:
Foo.bar
并不:
A.foo.bar
那是什么样的警告装置。
其原因是, bar
不是的一员 实例 的 Foo
.相反, bar
是全球性的,上课 Foo
.编译器想要你参考它在全球而不是假装这是一个成员的实例。
是没有意义在把这两个静态的变量,在这些课程只要你只需要访问静态的成员。编译器期待你访问他们的谷类名前缀如:
package1.Foo.bar
package2.Foo.bar
一旦你创建的目的:
public static package1.Foo foo;
它不是被访问,在一个静态的方式。你将不得不使用这类名字,当然,整套名称地址的类,因为他们有相同的名称在不同的软件包
这是真的,一Foo实例访问Foo是静态的领域,但认为对这个词的"静态".它的意思是"静态约束",至少在这种情况。由于A.foo的类型Foo,"A foo。酒吧"是不是要问的对象"酒吧",这是要去直到类。这意味着,即使一个子类有一个静态的领域被称为"条",并foo是一个实例,这类中,它会得到Foo。酒吧,不FooSubclass.酒吧。因此它是一个更好的想法,以参照它通过的类的名称,因为如果你尝试利用的继承你会搬起石头砸自己的脚。
不隶属于 StackOverflow