【问题标题】:How can I access non public fields of non public class in other package?如何访问其他包中非公共类的非公共字段?
【发布时间】:2019-06-24 01:12:43
【问题描述】:

如何访问其他包中非公共类的非公共字段?

我有以下非公共类,我想从其他包中的类调用 getString。我该怎么做?

class ABC{
   String getString(){
     return "ABC"
   }
}

【问题讨论】:

标签: java


【解决方案1】:

这就是我们在 Java 中所说的 access-level

文档实际上非常棒,您可以在here 找到它。 请参见下表(从文档中复制)。

  • 修饰符 -> 指publicprivate<no modiefier>protected
  • 范围 -> 它指的是您尝试访问字段的位置(例如classsubclass 等)
  • Y -> 表示可以从特定范围访问字段。
  • N -> 表示无法从特定范围访问字段。

访问级别

+--------------------------------------------------+
| Modifier    | Class | Package | Subclass | World |
|-------------|-------|---------|----------|-------|
| public      |   Y   |    Y    |    Y     |   Y   |
|-------------|-------|---------|----------|-------|
| protected   |   Y   |    Y    |    Y     |   N   |
|-------------|-------|---------|----------|-------|
| no modifier |   Y   |    Y    |    N     |   N   |
|-------------|-------|---------|----------|-------|
| private     |   Y   |    N    |    N     |   N   |
+--------------------------------------------------+

这实际上是一个非常有趣的事实,即不添加任何修饰符 您的代码实际上比使用 protected 修饰符更安全(与“世界”隔离)。

要使一个类(或方法)对世界其他地方隐藏,除了它自己的包之外,你不给它任何修饰符。就像我在下面用class ABC 展示的那样。

一种可能的解决方案是在同一个包中创建另一个类,该类只能访问您希望世界其他地方看到的字段。

package myPackage;

class ABC{
//implementation
}

package myPackage;

public class XYZ{

    /**
    *@return This method will invoke the getString() method in class ABC
    */
    public String getString(){
        return ABC.getString();//supposing that getString() is static
    }
}

package different_package;

import myPackage.*;

public class Main{

    //You could also do: 'myPackage.XYZ <variable name>'
    XYZ xyzInstance= new XYZ();

    /*some code*/

    // Accesses the method you want
    xyzInstance.getString();
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-03-18
    • 2013-09-11
    • 2019-05-01
    • 2018-12-29
    • 2013-04-09
    • 1970-01-01
    • 2011-01-30
    • 1970-01-01
    相关资源
    最近更新 更多