我有两个课程,并要包括一个静态的实例一种类内的其他和访问静态的领域,从第二级通过的第一个。

是这样我可以有不同的实例中,与相同的名称。

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.酒吧。因此它是一个更好的想法,以参照它通过的类的名称,因为如果你尝试利用的继承你会搬起石头砸自己的脚。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top