我是OOP的新手。
我知道有三个标识符,它们应该在不同的情况下使用。 我还阅读了很多关于使用“公共”标识符是否太危险的讨论。但我真的不明白为什么这很危险。
假设我有一个Windows应用程序或Web应用程序。在那些应用程序中,我声明了一些公共方法或变量,这有多危险? 我的意思是,我的应用程序接受用户输入然后产生输出,那么它在哪些方面会有危险? 由于“公共”标识符,其他人或其他程序如何攻击或利用或以某种方式对应用程序造成一些损害。
任何人都能描述一个现实生活中的例子吗?感谢。
答案 0 :(得分:6)
Modifier | Class | Package | Subclass | World
————————————+———————+—————————+——————————+———————
public | ✔ | ✔ | ✔ | ✔
————————————+———————+—————————+——————————+———————
protected | ✔ | ✔ | ✔ | ✘
————————————+———————+—————————+——————————+———————
no modifier | ✔ | ✔ | ✘ | ✘
————————————+———————+—————————+——————————+———————
private | ✔ | ✘ | ✘ | ✘
<强>私人:强>
方法,变量和构造函数
声明为private的方法,变量和构造函数只能在声明的类本身中访问。
私有访问修饰符是限制性最强的访问级别。类和接口不能是私有的。
注意强>
如果类中存在公共getter方法,则可以在类外部访问声明为private的变量。在超类中声明受保护的变量,方法和构造函数只能由其他包中的子类或受保护成员类的包中的任何类访问。
<强>受保护的强>
受保护的访问修饰符不能应用于类和接口。
方法,字段可以声明为protected,但是接口中的方法和字段不能声明为protected。
注意强>
受保护的访问权使子类有机会使用辅助方法或变量,同时防止非相关类尝试使用它。
公开强>
可以从任何其他类访问声明为public的类,方法,构造函数,接口等。
因此,可以从属于Java Universe的任何类访问在公共类中声明的字段,方法,块。
答案 1 :(得分:2)
让我们把它带到元级别,并假装我们是类Person
的实例。
我们有一些关于我们的信息 - name
,age
,gender
,weight
,height
,hairColor
,{{1}等等。大多数情况下,这是我们通过偶然互动向外界揭示的信息,因此可以将其视为“公共”信息。我的意思是,隐藏你的eyeColor
是没有意义的,除非你真的想要...
现在,有一些事情我们不告诉外面的世界,但愿意告诉我们的孩子。这些是食谱,如何解决数学问题,如何处理税,如何处理令人讨厌的分手等等。这些函数通过继承传递下来,因此,只能用祖先层次结构来引用。我们称之为“受保护”信息,或称为解决这些问题的“受保护”方法。
我们只保留在家庭中的东西,例如你的小狗咀嚼了你姐姐最喜欢的娃娃的次数,或家庭遗产的地方。我们可以通过一些文字思考来考虑这个问题,在我们家庭的等级制度中保密。
最后,有些事情我们不与其他人分享,但我们需要这些信息每天都能运作。这是我们认为是“私人”的。
现在,该元例子的插图是Access Modifiers的经典例子。
eyeColor
表示每个人都可以看到并按照自己的意愿行事。也就是说,如果你有一个public
可访问的名字,那么我可以随心所欲地将其改为“Overflow Prime”,并且你无能为力。
public
表示此字段或方法仅对直接从类继承的人可见。因此,例如,protected
意味着我可以访问Child extends Parent
受保护的方法和字段。
“package-private”,或简称为“no modifier”,是一个只能在包范围内访问和修改的字段或方法。这意味着就包而言,字段为Parent
,但对于包之外的任何内容都完全不知道。
public
是只有该类的实例可以直接使用和操作的字段或方法。即使有一个继承链,如果方法或字段是私有的,那么子类也无法达到它。
现在,就现实世界的例子而言,这意味着什么?
例如,假设您的Web应用程序处理了敏感信息,例如财务记录。如果我能够将每周支付支票存根的类的实例从微不足道的600美元修改为可观的79,999美元,那么我会破坏应用程序的完整性,暴露出一个重大的财务错误(从中发生了不好的事情) ),本来可以为我的麻烦做一次体面的检查。
这就是encapsulation背后的想法。我想只向外界揭示最低限度的钩子和信息,以确保我的应用程序的完整性,并确保有人不能自己削减他们应得的支票。
答案 2 :(得分:1)
以下是您的回答:https://softwareengineering.stackexchange.com/questions/143736/why-do-we-need-private-variables
简而言之,从长远来看,这是一个保持复杂性和可重用性的问题。通过确保变量对某个类是私有的,您可以阻止其他程序员(甚至是您未来的自己)修改影响类内部的任何主要变量。
至于一个真实世界的例子,想象一下你未来的自我坐下来写下你写的一些代码,并试图找出某个错误发生的位置。经过几天的狩猎后,您确定了罪魁祸首:修改了您班级实例的成员变量。甚至不是你,而是你的团队成员依赖于那个变量。
现在你有一个大问题。私有变量可以避免所有这些麻烦。
答案 3 :(得分:0)
我试图在非常基本的代码和评论的帮助下回答这个问题。
package com.oops;
public class Modifiers {
public int a = 0;
private int b = 0;
protected int c = 0;
int d = 0;
public static void main(String[] args) {
new TestPublic().getAndPrintA();
new TestPrivate().cannotGetB();
new TestProtected().getProtected();
new TestDefault().getDefault();
}
}
class TestPublic {
public void getAndPrintA() {
Modifiers modifiers = new Modifiers();
modifiers.a = 10; // Public variables can be used from anywhere.
}
}
class TestPrivate {
public void cannotGetB() {
Modifiers modifiers = new Modifiers();
// modifiers.b; //Compile time error: The field Modifiers.b is not
// visible
}
}
class TestProtected {
public void getProtected() {
Modifiers modifiers = new Modifiers();
modifiers.c = 10; // Visible here, but will not be visible to the
// outside world.
// Protected means package and subclass
}
}
class TestDefault {
public void getDefault() {
Modifiers modifiers = new Modifiers();
modifiers.d = 10; // Visible here, but will not be visible to the
// outside world and subclass.
// Default means only within package.
}
}
答案 4 :(得分:0)
尽管其他人已经很好地解释了这些概念,但我认为问题需要一个真实的例子。以下是尝试解释概念。 请注意包名: myarea
package myarea;
public class MyHome{
private int frontDoorLock;
public int myAddress;
int defaultWifiPaswd;
}
现在评论(工作/不起作用)解释清楚 在另一个文件中,相同的包: myarea
package myarea;
public class MyBedroom{
public static void main(String[] args) {
MyHome a = new MyHome();
int v1 = a.myAddress; // works
int v2 = a.defaultWifiPaswd; // works
int v3 = a.frontDoorLock; // doesn’t work
}
}
另一个文件不同的包: neighbourArea
package neighbourArea;
import myarea.MyHome;
public class NeighbourHome{
public static void main(String[] args) {
MyHome a = new MyHome();
int v1 = a.myAddress; // works
int v2 = a.defaultWifiPwd; // doesn’t work
int v3 = a.privateVar; // doesn’t work
}
Originally I shared this in support to explain one of article in Java code geeks.