【问题标题】:How to access non-static class fields in a package from the (default package)?如何从(默认包)访问包中的非静态类字段?
【发布时间】:2016-11-19 07:55:02
【问题描述】:

所以我有这个类(我们称它为“A”)和这个get() 方法,它返回一个类字段,我想从另一个类(“B”)访问它。 重要提示:两个类都是abstract 这些类在同一个package 中(package private 代表所有AB 成员)。 Main 类没有包(或者更好的是默认包)。

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

我需要从B 类访问Aget() 方法。

尝试过:

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 类中导入了Main 类。

我一直犯的最严重的错误是认为我必须访问main.main(String[])... etc ...Aobjmain本身开始,这是一个非常糟糕的想法(仍然无法弄清楚我是怎么想的)。

事实上,就像 Stephen C 指出的那样:

无论包的情况如何,无论您通过其他类的路径如何,都是正确的。

最后,代码示例......老实说,现在的代码与我写这个问题的日子真的不同,老实说我无法重现错误的情况,因为我不记得我所有的错误逻辑试图实现。 (我的错。)我只希望这次能正确解释自己。

感谢大家的帮助。

【问题讨论】:

标签: java packages class-visibility


【解决方案1】:

如果B的get()方法不是static,那么你需要一个B的实例才能调用该方法;例如

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

确实不考虑包的情况,不考虑你通过其他类的路径等等。 (虽然我不确定我是否完全理解你对所有这些的“散文”描述......)

【讨论】:

  • 我尽力描述它,但我知道如果没有代码示例可能很难实现这种情况。我会尝试添加一个,现在谢谢
  • 我认为示例代码肯定是一种更清晰的表达方式。
【解决方案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
    }

}

【讨论】:

  • 非常有帮助,但是我无法实例化 AB:它们都是 abstract
猜你喜欢
  • 2010-09-21
  • 1970-01-01
  • 1970-01-01
  • 2011-06-26
  • 1970-01-01
  • 2017-08-19
相关资源
最近更新 更多