Java Encapsulation Concept不清楚

use*_*404 24 java encapsulation

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

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

实例如下

// 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";
        }

    }
}
Run Code Online (Sandbox Code Playgroud)

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

print employe details:0 null

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

use*_*071 39

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

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

封装是四个一个基本的OOP概念 .Encapsulation是一类私人制作领域,并通过公共方式提供接入领域的技术.如果某个字段被声明为私有,则该类之外的任何人都无法访问该字段,从而将该字段隐藏在该类中.因此,封装也称为数据隐藏.

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

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

举一个小例子:

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;
   }
}
Run Code Online (Sandbox Code Playgroud)

上述方法称为Accessors(又名getter和setter).现在你可能会问,

  • 你为什么要使用访问器..? 实际上有许多充分的理由考虑使用访问器而不是直接暴露类的字段.Getter和Setters使API更稳定.

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

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

至于你当前的问题:

  1. 你有两个不同的类,每个类都有一个main.那是错的.他们将拥有不同的属性.
  2. @Subhrajyoti Majumder建议的代码更改是正确的.检查解决问题的答案.

在此期间,请继续阅读

为了更好地理解这些概念.希望能帮助到你.:)


Jun*_*san 6

您似乎分别运行两个不同的类,并假设运行时对属性所做的更改EmployeeTest 将反映在Employee运行中.请注意,更改将反映在同一JRE实例中.对不起,万一我误解了你的问题.

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

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);
    }

}
Run Code Online (Sandbox Code Playgroud)


Sub*_*der 4

public static字段与类相关联而不是与对象相关联,它破坏了对象的封装规则。

Employee具有两个封装字段的类empid & empname。

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

    public int getEmpid(){
        return this.empid;
    } 
    public void setEmpid(int empid){
        this.empid = empid;
    }
    ...
}

public class EmployeeTest {
      public static void main(String[] args) {
            Employee e = new Employee();
            e.setempId(1);
            Employee e1 = new Employee();
            e1.setempId(2);
      }
}
Run Code Online (Sandbox Code Playgroud)

用于更好地理解封装的文档

  • “static”如何破坏封装?将成员变量声明为“public”违反了封装性,但是为什么“static”通常会违反封装性呢? (2认同)