Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何正确访问静态成员类?_Java_Static - Fatal编程技术网

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方式”。我知道这是可能的,因为我可以创建静态的内部类,它不会给出错误,但这将是一个维护噩梦,因此理所当然地不鼓励这样做。