Java 什么时候应该使用Get方法而不是直接调用变量?

Java 什么时候应该使用Get方法而不是直接调用变量?,java,global-variables,Java,Global Variables,好的,我刚刚发现,如果你有一个带有全局变量的类,你可以在另一个类中调用它,只需说class.variable,现在我很困惑,为什么getVariable和setVariable方法存在,而它们已经可以访问了 假设我们有这两门课 public class MyClass { public int num; public String str; public MyClass (int num, String str) { this.num = num;

好的,我刚刚发现,如果你有一个带有全局变量的类,你可以在另一个类中调用它,只需说class.variable,现在我很困惑,为什么getVariable和setVariable方法存在,而它们已经可以访问了

假设我们有这两门课

public class MyClass {
    public int num;
    public String str;
    public MyClass (int num, String str) {
        this.num = num;
        this.str = str;
    }
    public int getNum () {
        return num;
    }
    public String getStr () {
        return str;
    }
}
public class test {
    public static void main (String[] args) {
        MyClass x = new MyClass (3, "string");
        System.out.println(x.num);
        System.out.println(x.str);
        System.out.println(x.getNum());
        System.out.println(x.getStr());
        x.num = 4;
        System.out.println(x.num);
    }
}

在这两种方式中,它从对象访问相同的数据并输出相同的内容。一种方法比另一种方法更好吗?或者在某些情况下,其中一种方法不起作用吗?

简短回答:封装

一个主要的好处是防止其他类或模块,特别是那些您没有编写的类或模块滥用您创建的类的字段

例如,您可以使用一个实例变量int,该变量在您的一个类方法中用作分母。您知道,当您编写代码时,从不将此变量赋值为0,甚至可能在构造函数中执行一些检查。问题是,其他一些人可能会实例化您的类,然后将实例变量的值指定为0,从而在以后调用使用该变量作为分母的方法时引发异常(不能除以0)

使用setter,您可以编写确保此变量的值永远不会为0的代码


另一个优点是,如果希望在实例化类后使实例变量为只读,则可以将变量设为私有变量,并只定义getter方法而不定义setter。

仅仅因为您可以做一些事情,并不意味着您应该这样做。如果存在公共getter,则类的数据成员应该是私有的/受保护的。