我经历了几个博客,我得到了以下积分。 Encapsulation Blog
考虑名称和地址作为其字段的Employee
。 Organization
和Organization2
类会为员工变量分配值并打印相同的内容。
public class Employee {
public String name;
public String address;
public void printEmpDetails() {
System.out.println("Employee name :" + name + ", Employee address :"
+ address);
}
}
public class Organization {
public static void main(String[] args) {
System.out.println("Employee details of org");
Employee emp = new Employee(); //New Instance variable created
emp.name= "JOHN";
emp.address = "JOHN ADDRESS";
}
}
public class Organization2 {
public static void main(String[] args) {
System.out.println("Employee details of org2");
Employee emp = new Employee(); //New Instance variable created
emp.name= "JAMES";
emp.address = "JAMES ADDRESS";
}
}
Organization
正在创建一个员工实例(将自己的一组值分配给员工)Organization2
也在创建一个员工实例(将自己的一组值分配给员工)问题: 因为它是两个不同的实例。封装是如何违反的?
答案 0 :(得分:2)
Employee
级违反了封装。变量name
和address
是公开的。它们应该private
,并且应该为它们定义getter和setter。
答案 1 :(得分:1)
重点是不要将类内部暴露给外部。此规则需要为您的代码提供灵活性。
在您的代码中,您可以直接访问Organization
和Organization2
类Employee
和public class Employee {
private String name;
private String address;
public String getName() {
return this.name;
}
public String getAddress() {
return this.address;
}
public void setName(String newName) {
this.name = newName;
}
public void setAddress(String newAddress) {
this.address = newAddress;
}
}
类。而不是那样,建议为两个变量声明setter和getter。
name
请注意,字段address
和name
被声明为私有。
例如,如果您重新设计了Employee类的内部结构,则只需要重写getter和setter。所有其余代码都不需要干预。
如果您直接访问address
和Employee
字段,则需要重写所有访问这些变量的代码,以防您更改这些变量名称,甚至使用其他数据源,而不是这些变量。
<小时/> 更新№1
在您的情况下,封装意味着您需要在此类中隐藏Employee
类的实现。公开变量名称会暴露您的类的内部结构,并且与您的Employee类交互的所有代码都严格限制在您的Employee
类结构中。
假设以下情况。您的客户现在要求您修改name
课程的内部结构。您应该只存储客户ID(新的类字段),但应从数据库中读取address
和name
。
如果你有getter和setter,你只需要重写这些Employee类的getter和setter。您的外部代码不会注意到此更改。
但如果您直接访问address
和Organization
,则需要更改Organization2
和{{1}}类中的代码。
现在假设您有300个类,它们可以直接相互访问。
<小时/> 更新№2
当我不在的时候你在聊天中的问题:
谢谢这是我在抽象和封装上的未知。以汽车为例本身抽象 - 隐藏汽车中某个功能的内部工作。 Say Break系统 - 汽车制造商告诉你 - 如果你按下break,它会停止(这里我们隐藏了破坏系统是如何工作的)封装 - 提供一个公共接口来访问休息时间。汽车用户应该使用该特定的公共界面来操作休息时间。作为制造商,我可以决定当用户应用中断时要实现的逻辑,并且此逻辑在将来可能会发生变化,而无需用户注意。
我的回答:
是的,制造商只提供公共接口(断路踏板),驱动程序不应该担心系统的内部机制。如果制造商决定改变机制,他需要保留公共接口(断开踏板),并且可以改变机制的内部。并且司机不会注意到这种变化。相同的方法适用于编程类。如果隐藏(封装)类的内部,则可以使应用程序更易于维护和灵活。答案 2 :(得分:0)
封装的目的不是为了防止不同的实例相互影响,而是要明确区分哪个类拥有数据以及与之相关的逻辑应该在哪里。
例如,假设您要向Employee
引入一个附加属性,其中包含重命名的次数。如果您将数据成员公开为public
,则使用Employee
的每个组织类都需要记住更新此新属性。
但是,如果您的数据成员是私有的,而其他类只能使用类&#39;来操作它们。方法,您可以确保在类中封装这个逻辑:
public class Employee {
private String name;
private int numRenames = 0;
public String getName() {
return name;
}
public in getNumRenames() {
return numRenames;
}
public void setName(String name) {
this.name = name;
++numRenames;
}
// rest of the class snipped
}
答案 3 :(得分:0)
封装的基本概念是隐藏实现。虽然您可以执行相同的工作,使字段公开,但您可以直接访问该类的实现。这就是为什么据说使用getter,setter方法。
但这一切都取决于你想要做什么。有时提供直接访问可能更好,而无需实现任何getter,setter方法
答案 4 :(得分:-1)
这听起来像是家庭作业。但是,我心情很好,所以我仍然会帮助你:)
不要将字段公开为public,因为任何其他类都可以直接修改变量。
public class Employee {
public String name;
public String address;
字段为public
,因此会破坏封装。