如何从(默认包)访问包中的非静态类字段?

时间:2016-07-16 03:22:31

标签: java packages class-visibility

所以我有这个课程(让我们称之为#34; A"),这个get()方法返回一个类字段,我想从另一个类访问它(& #34; B&#34)。 重要提示:这两个类都是abstract这些类位于同一package package private所有AB成员中。 Main类没有包(或更好,默认包)。

[之前:扭曲和无用的描述]

我需要B班级来访​​问A get()方法。

试过:

1)从位于Aobj.get()的根对象开始的非静态调用main,但它似乎想要静态调用(很奇怪,没有成员是static);

2)试图静态访问它,我得到Cannot make a static reference to the non-static field错误(当然)。

...所以我一直坚持,仍然得到访问语法错误,我尝试两种方式。有什么建议吗?

编辑:

所以我走到了尽头。我现在试着解释我的错误。

基本上,问题是我想从包中的类访问位于Main类(默认包)中的对象。所以我遇到了可见性问题。

在其他情况下,我已经解决了导入该类的问题,但我发现了you cannot import a class located in the default package,因此我在main中创建了Main包并导入了B类类。

我一直犯的最大错误是认为我必须从 main.main(String[])... etc ...Aobj 本身开始 main >,这是一个非常糟糕的想法(仍然无法弄清楚我的想法)。

事实上,就像斯蒂芬C指出的那样:

  

无论包裹的情况如何,无论你通过其他课程的路径如何,都是如此。

最后,代码示例......说实话,代码现在与我写这个问题的日子真的不同,说实话,我不能重现错误的条件,因为我不记得所有我试图实现的错误逻辑。 (我的错。)这次我只想说明自己。

感谢大家尝试提供帮助。

2 个答案:

答案 0 :(得分:2)

如果B&#get()方法不是static,那么如果要调用该方法,则需要B的实例; e.g。

  B b = ....
  b.get();

对于包的情况是真实的无论,并且与您通过其他类的路径无关等等。 (虽然我不确定我完全理解你的"散文"对所有这些的描述......)

答案 1 :(得分:2)

根据您所描述的内容(无代码),您需要访问b的实例。有两种方法可以实现。如果相关A中的方法可以为每个调用使用不同的B实例,只需在该方法中添加B参数:

public class B {

    public int get() { //Or whatever the return type of get is
        //...
    }

}

public class A {

    public int methodThatNeedsABInstance(B instance) {
        int x = instance.get(); //Can call get method
    }

}

然后通过以下方式调用:

B b = new B();
A a = new A();
a.methodThatNeedsABInstance(b);

如果每个A实例应对其所有调用使用相同的B实例,请将其设为B类型的字段:

public class A {

    private B instance;

    //Constructors, setters and getters for b as necessary    

    public int methodThatNeedsABInstance() {
        int x = instance.get(); //Can call get method
    }

}