- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
这是基本问题,但我仍然不了解封装概念。我不明白我们如何从其他类更改类的属性。因为每当我们尝试设置类的公共(public)实例值,我们必须创建该类的对象,然后设置值。每个对象引用不同的内存。所以即使我们改变这不会影响任何其他对象的实例值。
即使我尝试使用静态公共(public)实例值进行更改,我也无法更改类属性值。
示例如下
// 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
类时,我都会得到相同的值
打印员工详细信息:0 null
即使我没有遵循封装概念,也无法更改员工类的公共(public)实例值。请帮助我理解我出错的概念。
最佳答案
是的,这有时会有点令人困惑。让我们一步一步来:首先,你需要了解
封装是四个OOP 基本概念之一。封装是将类中的字段设为私有(private)并通过公共(public)方法提供对字段的访问的技术。如果一个字段被声明为私有(private)的,它不能被类外的任何人访问,从而隐藏了类中的字段。因此,封装也称为数据隐藏。
封装可以描述为一个保护屏障,防止代码和数据被类外定义的其他代码随机访问。对数据和代码的访问由接口(interface)严格控制。
封装的主要好处是能够在不破坏使用我们代码的其他人的代码的情况下修改我们实现的代码。借助此功能封装为我们的代码提供了可维护性、灵 active 和可扩展性。
举个小例子:
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;
}
}
上述方法称为访问器(又名 getter 和 setter)。现在你可能会问,
例如,考虑一个类中的一个公共(public)字段,该字段可供其他类访问。现在稍后,您想在获取和设置变量时添加任何额外的逻辑。这将影响使用 API 的现有客户端。因此,对该公共(public)字段的任何更改都需要更改引用它的每个类。相反,使用访问器方法,可以很容易地添加一些逻辑,比如缓存一些数据,稍后再懒惰地初始化它。此外,如果新值与以前的值不同,则可以触发属性更改事件。所有这些对于使用访问器方法获取值的类来说都是无缝的。
关于它们是什么以及它们是什么的教程和解释太多了。谷歌他们。
至于您当前的问题:
与此同时,请继续阅读
为了更好地理解这些概念。希望能帮助到你。 :)
关于Java封装概念不清楚,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19044362/
关闭。这个问题是off-topic .它目前不接受答案。 想改进这个问题? Update the question所以它是on-topic对于堆栈溢出。 10年前关闭。 Improve this qu
我正在开发一个 Android 应用程序。在此应用程序中, Logo 栏显示在所有页面( Activity )上,或者我们可以说它在所有页面上都有标题。这个 Logo 栏有几个图标,如主页、登录、通知
我正在使用 hadoop 使用开源接口(interface) HVPI 处理视频。然而,inputsplit 的实现,更准确地说是在 isSplitableobContext (context, Pa
1. 是什么? MySQL 是最流行的关系型数据库管理系统,在 WEB 应用方面 MySQL 是最好的 RDBMS(Relational Database Management System
有没有办法使用 c++20s 的概念来检查一个值是否满足某些要求? 假设我正在编写某种使用分页的容器,并且我想让页面大小成为模板参数。 template class container; 我可以使用带
如何在 ArrayList 中循环遍历 ArrayList? 例如,如果我有一个名为 Plants of Plant 对象的 ArrayList。每个 Plant 对象内部都有一个随机数量的花名。我如
如何在UML类图中绘制C++概念? 具体来说,我有以下代码: template concept Printable = requires(T a, std::ostream &where) {
我有兴趣制作一个网站,在访问者访问时闪现整个网络历史记录。我计划使用 JavaScript 来获取每个观看者计算机上的历史记录,并根据他们拥有的内容以不同的速度对其进行动画处理。我的想法是使用 his
有一个模板定义,例如: template void foo( void ) { /* ... */ } 如何定义一个概念,以便N必须为非零正值(N> = 1)? 就像是: template con
封装是信息隐藏还是导致信息隐藏? 正如我们所说,封装将数据和函数绑定(bind)在单个实体中,因此它为我们提供了对数据流的控制,并且我们只能通过一些定义良好的函数来访问实体的数据。因此,当我们说封装导
下面有一个简单的代码片段,它使用以下方式进行编译: g++-9 -std=c++2a -fconcepts 这是试图定义一个需要存在函数的概念。我希望输出是"is",但事实并非如此……知道为什么吗?谢
我有一个普通二元运算符的概念 template concept is_binary_operation = requires (const T& t1, const T& t2) // e.g
我正在c++ 20中实现具有启发式功能的搜索算法。 我试图用类似这样的概念来约束我的算法可以使用的功能: template concept Heuristic = requires(SelfType
我需要了解 SAS 如何读取/执行数据步骤。当我查找有关 SAS 如何读取数据步骤的信息时,我似乎只找到有关它如何读取以进行合并的信息,我不了解与常规数据步骤相关的信息。比方说,我有这行代码: dat
最近我看到一个关于“框架”的问题,如果“框架”有不同的类型或概念。那么,存在不同“类型”的“框架”吗? 例如:NodeJS 是一种“类型”(概念),而 Hibernate ORM 是另一种“类型”(概
如何使用任何技术禁用或清除客户端浏览器 Cookie 我认为使用 javascript 可以用于任何技术 最佳答案 var cookies = document.cookie.split(";");
我正在使用 target = "_blank" 单击链接时生成新选项卡。但是,浏览器会将焦点移至该选项卡。 有没有办法让焦点保持在当前标签页上? 回答摘要 基本上,只需发送一个模拟控件点击的当前事件。
我正在尝试在我的 android/firebase(cloud firestore) 应用程序上添加一项需要其他用户批准/拒绝的功能。例如,当 Air&BnB 上的用户想要预订一个地方时,所有者必须批
这个问题在这里已经有了答案: mysql_fetch_array()/mysql_fetch_assoc()/mysql_fetch_row()/mysql_num_rows etc... expec
public class MyClass { public static void main(String[] args) { System.out.println("Hell
我是一名优秀的程序员,十分优秀!