Java封装概念不明确

2022-09-01 18:26:11

这是一个基本问题,但我仍然不了解封装概念。我不明白如何从其他类更改类的属性,因为每当我们尝试设置类的公共实例值时,我们必须创建该类的对象,然后设置值。并且每个对象都引用不同的 memory.so 即使我们更改实例值,这不会影响任何其他对象。

即使我尝试使用静态公共实例值进行更改,也无法更改类属性值。

下面给出了示例

// Employee class
public class Employee {
    public static int empid;
    public static String empname;

    public static void main(String[] args) {
        System.out.println("print employe details:"+empid+" "+empname);
    }

    // EmployeeTest  class
    public class EmployeeTest {

        public static void main(String[] args) {
            Employee e = new Employee();
            e.empid=20;
            e.empname="jerry";
            Employee.empid=10;
            Employee.empname="tom";
        }

    }
}

每次我上课时,我都会得到相同的价值Employee

print employe details:0 null

即使我不遵循封装概念,也无法更改员工类的公共实例值。请帮助我理解我出错的概念。


答案 1

是的,这有时可能会有点令人困惑。让我们一步一步来:首先,你需要了解

  • 什么是封装,为什么使用它?

封装是四个基本的 OOP 概念之一。封装是一种将类中的字段设为私有并通过公共方法提供对字段的访问的技术。如果某个字段被声明为 private,则类外部的任何人都无法访问该字段,从而隐藏了类中的字段。因此,封装也称为数据隐藏。

封装可以被描述为一种保护屏障,它防止代码和数据被类外定义的其他代码随机访问。对数据和代码的访问由接口严格控制。

封装的主要好处是能够修改我们实现的代码,而不会破坏使用我们代码的其他人的代码。借助此功能,封装为我们的代码提供了可维护性、灵活性和可扩展性

举个小例子:

public class EncapTest{

   private String name;
   private String idNum;
   private int age;

   public int getAge(){
      return age;
   }

   public String getName(){
      return name;
   }

   public String getIdNum(){
      return idNum;
   }

   public void setAge( int newAge){
      age = newAge;
   }

   public void setName(String newName){
      name = newName;
   }

   public void setIdNum( String newId){
      idNum = newId;
   }
}

上述方法称为访问器(又名 getters 和 setter)。现在你可能会问,

  • 为什么要使用访问器..?实际上,考虑使用访问器而不是直接公开类的字段有很多很好的理由。Getter 和 Setter 使 API 更加稳定。

例如,考虑由其他类访问的类中的字段 public。稍后,您希望在获取和设置变量时添加任何额外的逻辑。这将影响使用 API 的现有客户端。因此,对此公共字段的任何更改都需要对引用它的每个类进行更改。相反,使用访问器方法,可以轻松添加一些逻辑,例如缓存一些数据,稍后懒洋洋地初始化它。此外,如果新值与以前的值不同,则可以触发属性已更改事件。所有这些都将与使用访问器方法获取值的类无缝连接。

有很多教程和解释,关于如何以及它们是什么。谷歌他们。

至于你目前的问题:

  1. 您有两个不同的类,每个类都有一个主类。这是错误的。它们将具有不同的属性。
  2. @Subhrajyoti Majumder建议的代码更改是正确的。检查答案以解决问题。

同时,请继续阅读

以便更好地理解概念。希望它有帮助。:)


答案 2

您似乎正在分别运行两个不同的类,并假设在运行时对属性所做的更改将在运行中反映出来。请注意,更改将反映在同一 JRE 实例中。请原谅我,以防我误解了你的问题。EmployeeTestEmployee

编辑:根据用户输入。下面是有关如何访问和更新静态成员值的代码:

class Employee {
    public static int empid;
    public static String empname;

    public static void main(String[] args) {
        System.out.println("print employe details:" + empid + " " + empname);
    }
}

// EmployeeTest class
public class EmployeeTest {

    public static void main(String[] args) {
        Employee e = new Employee();
        e.empid = 20;
        e.empname = "jerry";
        Employee.empid = 10;
        Employee.empname = "tom";
        Employee.main(null);
    }

}

推荐