Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/372.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_Arraylist_Methods - Fatal编程技术网

Java方法中的私有和公共变量

Java方法中的私有和公共变量,java,arraylist,methods,Java,Arraylist,Methods,假设我有一个使用多个ArrayList的类: public static ArrayList<String> openable = new ArrayList<>(); public static ArrayList<String> commands = new ArrayList<>(); public static ArrayList<String> mail = new ArrayList<>(); public st

假设我有一个使用多个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<>();
如果我要调用通常在Main_菜单类中调用的方法,请使用具有相同名称的私有新变量从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的方法是使用主菜单类中公共变量的数据,还是使用Connect类中变量的私有数据?

请参见:

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)

我假设Connect类中的静态字段仅仅覆盖了Main_菜单类中相同字段的可见性。在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
    }
}
playerdy.java:

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

私有字段不会成为公共字段。@ElliottFrisch我从来没有说过它们会成为公共字段?我在问是否有两个同名的变量,一个是公共的,一个不是,它是从使用其中一个变量的方法调用的,它使用哪一个?它们是两个不同类中的变量;当然他们是不同的。运行一个基本的测试用例将立即显示这一点,而不必感到奇怪。不相关,但请坚持Java命名约定,例如MainMenu。您的问题不是100%清楚,但它似乎基本上是关于什么的。我只是有一些建议。你可以忽略它们,但我希望你至少试着考虑一下。首先,不要将非最终变量公开为绝对规则,这在语言中是不允许的,即使这些变量是最终变量,最好不要将可变对象公开。这一点已被广泛接受,即使您知道自己在做什么,并且故意违反其中一条规则,您也必须向几乎所有看到您的代码的人捍卫您的代码。第二,如果你避免使用静态数据,你会发现自己更快乐。创建一个具有非静态成员的实例,而不是一个充满静态的类。您的代码很好地代表了方法和字段重写,但不是一个子类重写一个范围较小的静态字段。@JordanGrant没有区别,范围规则是相同的。它们不是。您提供了访问私有字段的公共方法,因此您的示例当然有效。当我指出你的快捷方式的缺点时,你这个忍者把你的代码编辑成了无法编译的东西。静态类中不能有静态字段。您试图为OP简化一个示例,但回避了OPs真正的问题。@JordanGrant您是对的,我确实更新了我的答案,使之更简洁,但我在我的机器上再次运行了它,以确保它是正确的。如果你不能复制粘贴,那就是你的问题。此外,在您做出评论之前,您还应该阅读Java文档,比如在静态类中不能有静态字段,因为事实证明,您可以;这里显示的代码在任何类之外都有一个main方法;我认为您忘记在测试类中总结它了,因为也没有顶级静态类。就这么说吧。在改变态度之前,通常最好做一次理智的检查,以防万一:我还要说,这并不能真正说明OP提出的问题。
public class Playground extends Main {
        private static ArrayList<String> things = new ArrayList<>();
    }