当前位置: 首页 > 面试题库 >

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

芮念
2023-03-14
问题内容

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

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

我有2个查询:

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

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


问题答案:

实例变量被设为私有,以强制这些类的用户使用方法来访问它们。在大多数情况下,有简单的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");

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

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



 类似资料:
  • 问题内容: 我的任务是制作一个带有实例变量的程序,该变量应该由用户输入。但是我什至不知道什么是实例变量。什么是实例变量?如何创建一个?它有什么作用? 问题答案: 实例变量是在类内部但在方法外部声明的变量: 现在可以在其他类中实例化此IronMan类以使用这些变量,例如: 这就是我们使用实例变量的方式。无耻插头:来自实例本免费的电子书拉到这里这里。

  • 问题内容: 如果将变量声明为,那么我可以从任意位置访问它。我还知道,静态成员由类的所有实例共享,并且不在每个实例中重新分配。 声明变量与声明变量有什么不同吗? 在这两种情况下,都不能以任何其他类或从任何其他类访问它。 将变量声明为静态是否会赋予它其他特殊属性? 问题答案: 当然,可以将其作为,但只能从定义它的类内部进行访问-这是因为它被定义为。 或变量通常用于常量。例如,许多人不喜欢在代码中“硬编

  • 我读到了这个关于不可变对象的问题,留下了一个关于不可变对象和final字段的问题: 为什么我们需要不可变类中的实例变量成为最终变量? 例如,考虑这个不可变类: 如果在上面的代码中没有设置方法,并且实例变量只在构造函数中设置,那么为什么需要将实例变量声明为final?

  • 问题内容: 我读了这个问题不可变对象,并留下了关于不可变对象,并最终场一个问题: 为什么我们需要不可变类中的实例变量为最终变量? 例如,考虑以下不可变的类: 如果在上面的代码中没有set方法,而实例变量仅在构造函数中设置,为什么要求将实例变量声明为final? 问题答案: 有没有 要求 这样做的变量。但是,当您确实明确打算永远不更改变量时,通常这样做是一种好习惯,因为这不仅可以使变量避免错别字或其

  • 问题内容: 除了范围和存储差异外,java中实例变量和局部变量之间是否还有其他主要区别? 问题答案: 我能想到的一件事: 实例变量具有默认值,即如果为对象引用,则为null;如果为int,则为0。 局部变量不会获取默认值,因此需要进行显式初始化(​​如果您未这样做,则编译器通常会抱怨)。

  • 问题内容: 为什么在类中声明的变量具有默认值,但是在方法内部声明的变量(称为“局部变量”)在Java中没有默认值? 例如 在上面的示例中,变量的默认值为0,但是变量给出了可能尚未初始化的错误。 问题答案: 所有成员变量都必须加载到堆中,因此在创建类的实例时必须使用默认值进行初始化。对于局部变量,它们不会被加载到堆中,直到在Java7之前被使用,它们才会存储在堆栈中,因此我们需要显式初始化它们。现在