为什么Java中的实例变量总是私有的?

发布于 2021-01-31 15:13:32

我是Java的新手,并且正在学习封装,并看到了一个示例,其中实例变量在类中声明为私有。

http://www.tutorialspoint.com/java/java_encapsulation.htm

我有2个查询:

  1. 为什么实例变量是私有的?为什么不公开?
  2. 如果实例变量被公开并直接访问怎么办?我们看到约束了吗?

您能用一个例子说明在Java类中将实例变量声明为public时会出现什么问题吗?

关注者
0
被浏览
68
1 个回答
  • 面试哥
    面试哥 2021-01-31
    为面试而生,有面试问题,就找面试哥。

    实例变量被设为私有,以强制这些类的用户使用方法来访问它们。在大多数情况下,有简单的getter和setter方法,但也可以使用其他方法。

    例如,使用方法将允许您将访问限制为只读,即,如果没有设置器,则字段可以读取但不能写入。如果该领域是公开的,那将是不可能的。

    此外,您可能会为字段访问添加一些检查或转换,而对普通字段的普通访问则无法实现。如果某个字段是公共的,并且您以后想通过某种执行其他检查的方法来强制所有访问,则您必须更改该字段的所有用法。如果将其设为私有,则以后只需更改访问方法即可。

    如果phone是私人的:

    考虑这种情况:

    class Address {
      private String phone;
    
      public void setPhone(String phone) {
        this.phone = phone;
      }
    }
    
    //access:
    Address a = new Address();
    a.setPhone("001-555-12345");
    

    如果我们从这样的类开始,然后以后需要对phoneNumber进行检查(例如,一些最小长度,仅数字等),则只需更改设置器即可:

    class Address {
      private String phone;
    
      public void setPhone(String phone) {
        if( !isValid( phone) ) { //the checks are performed in the isValid(...) method
         throw new IllegalArgumentException("please set a valid phone number");
        }
    
        this.phone = phone;
      }
    }
    
    //access:
    Address a = new Address();
    a.setPhone("001-555-12345"); //access is the same
    

    如果phone是公开的:

    有人可以这样设置,phone而您对此无能为力:

    Address a = new Address();
    a.phone="001-555-12345";
    

    如果现在要强制执行验证检查,则必须将其设置为私有,写上述行的人必须将第二行更改为:

    a.setPhone("001-555-12345");
    

    因此,您不能只添加检查而不会破坏其他代码(它将不再编译)。

    此外,如果您通过方法访问类的所有字段/属性,则可以使访问保持一致,并且用户不必担心该属性是存储的(即是一个实例字段)还是经过计算的(仅存在方法而没有实例字段)
    )。



推荐阅读
知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看