【问题标题】:Private and Public variables in a method JavaJava方法中的私有和公共变量
【发布时间】:2016-07-30 00:47:21
【问题描述】:

假设我有一个使用多个 ArrayList 的类:

public static ArrayList<String> openable = new ArrayList<>();
public static ArrayList<String> commands = new ArrayList<>();
public static ArrayList<String> mail = new ArrayList<>();
public static ArrayList<String> mailCommands = new ArrayList<>();
public static ArrayList<String> previousCommands = new ArrayList<>();

我还有多个其他类,其中包含使用这些 ArrayList 的方法。假设我还有一个名为 connect 的类,它扩展了包含这些变量的第一个类:

public class Connect extends Main_Menu{

如果我要调用我通常在 Main_Menu 类中调用的方法,从 Connect 类中使用具有相同名称的私有新变量:

private static ArrayList<String> previousCommands = new ArrayList<String>();
private static ArrayList<String> openable = new ArrayList<>();
private static ArrayList<String> commands = new ArrayList<>();
private static ArrayList<String> mail = new ArrayList<>();
private static ArrayList<String> mailCommands = new ArrayList<>();

使用这些 ArrayList 的方法是使用来自 Main_Menu 类中的公共变量的数据还是使用来自 Connect 类中的变量的私有数据?

【问题讨论】:

  • private 字段不会变为 public
  • @ElliottFrisch 我从没说过他们做到了?我问是否有两个同名的变量,一个是公共的,一个不是,它是从使用其中一个变量的方法调用的,它使用哪个?
  • 它们是两个不同类的变量;当然他们是不同的。运行一个基本的测试用例会立即显示这一点,而不必怀疑。无关,但请遵守 Java 命名约定,例如,MainMenu
  • 不是 100% 清楚你在问什么,但它似乎基本上是关于 name masking
  • 我只是有一些建议。您可以忽略它们,但我希望您尝试至少考虑一下。首先永远不要公开非最终变量——绝对规则,在语言中不应该被允许,即使这些是最终的,最好不要公开可变对象。这已被广泛接受,即使您知道自己在做什么并故意违反这些规则之一,您也必须向几乎任何看到它的人保护您的代码。第二——如果你避免了静态,你会发现自己更快乐。创建一个具有非静态成员的实例,而不是一个充满静态的类。

标签: java arraylist methods


【解决方案1】:

自己看:

static class Parent
{ 
    public static int A = 5;

    public static int B = 18;

    public static int getA(){
        return A;
    }

    public static int getB(){
        return B;
    }
}

static class Child extends Parent
{
    private static int A = 10;

    public static int getA(){
        return A;
    }
}

public static void main(String[] args) {
    Parent p = new Parent();
    Child c = new Child();
    System.out.println("Parent A: " + p.getA());
    System.out.println("Parent B: " + p.getB());
    System.out.println("Child A: " + c.getA());
}

输出:

run:
Parent A: 5
Parent B: 18
Child A: 10
BUILD SUCCESSFUL (total time: 0 seconds)

【讨论】:

  • OP 确实特别提到了这些字段是静态的。您的代码很好地代表了方法和字段覆盖,但不是覆盖范围狭窄的静态字段的子类。
  • @JordanGrant 没有区别,范围规则是一样的。
  • 他们不是。您提供了访问私有字段的公共方法,因此您的示例当然有效。当我指出您的快捷方式的缺点时,您忍者将您的代码编辑为无法编译的内容。静态类中不能有静态字段。您试图简化 OP 的示例,但绕过了 OP 的实际问题。
  • @JordanGrant 你是对的我确实更新了我的答案以更简洁,但是我再次在我的机器上运行它以确保它是正确的。如果你不能复制粘贴那是你的问题。此外,在制作诸如“静态类中不能有静态字段”之类的 cmets 之前,您应该阅读 Java 的文档,因为事实证明,您可以。
  • 我可以剪切和粘贴;此处显示的代码在任何类之外都有一个main 方法;我认为您忘记将其包装在您的测试类中,因为也没有顶级静态类。只是在说'。在折腾态度之前,通常最好进行一次健全性检查,以防万一:)我还要说这并没有真正表明 OP 提出的问题。
【解决方案2】:

我认为 Connect 类中的静态字段只是覆盖 Main_Menu 类中相同字段的可见性。在 Connect 类的范围之外,该字段是不可见的,因此您无法访问它。如果你甚至可以编译,你会得到一个例外。

编辑:我假设您是直接访问这些静态变量,而不是通过其他用户建议的覆盖方法访问私有字段。

Main.java:

public class Main {
    public static ArrayList<String> things = new ArrayList<>();

    public static void main(String[] args){
        Playground.things;  // <- Cannot access private static field outside of that class
    }
}

Playground.java:

public class Playground extends Main {
        private static ArrayList<String> things = new ArrayList<>();
    }

【讨论】:

    猜你喜欢
    • 2013-05-03
    • 1970-01-01
    • 2011-11-13
    • 2012-01-25
    • 2011-05-25
    • 2014-10-06
    • 2014-08-21
    • 1970-01-01
    • 2011-12-03
    相关资源
    最近更新 更多