繁体   English   中英

访问标识符的真实示例[public,protected,private]

[英]Real example for access identifiers [public, protected, private]

我是OOP的新手。

我知道有三个标识符,它们应该在不同的情况下使用。 我还阅读了很多关于使用“公共”标识符是否太危险的讨论。 但我真的不明白为什么这很危险。

假设我有一个Windows应用程序或Web应用程序。 在那些应用程序中,我声明了一些公共方法或变量,这有多危险? 我的意思是,我的应用程序接受用户输入然后产生输出,那么它在哪些方面会有危险? 由于“公共”标识符,其他人或其他程序如何攻击或利用或以某种方式对应用程序造成一些损害。

任何人都可以形容现实生活中的例子 谢谢。

Modifier    | Class | Package | Subclass | World
————————————+———————+—————————+——————————+———————
public      |  ✔    |    ✔    |    ✔     |   ✔
————————————+———————+—————————+——————————+———————
protected   |  ✔    |    ✔    |    ✔     |   ✘
————————————+———————+—————————+——————————+———————
no modifier |  ✔    |    ✔    |    ✘     |   ✘
————————————+———————+—————————+——————————+———————
private     |  ✔    |    ✘    |    ✘     |   ✘

私人的:

方法,变量和构造函数

声明为private的方法,变量和构造函数只能在声明的类本身中访问。

专用访问修饰符是限制性最强的访问级别。 类和接口不能是私有的。

注意

如果类中存在公共getter方法,则可以在类外部访问声明为private的变量。 在超类中声明受保护的变量,方法和构造函数只能由其他包中的子类或受保护成员类的包中的任何类访问。

受保护

受保护的访问修饰符不能应用于类和接口。

方法,字段可以声明为protected,但是接口中的方法和字段不能声明为protected。

注意

受保护的访问权限使子类有机会使用辅助方法或变量,同时防止非相关类尝试使用它。

上市

可以从任何其他类访问声明为public的类,方法,构造函数,接口等。

因此,可以从属于Java Universe的任何类访问在公共类中声明的字段,方法,块。

http://javarevisited.blogspot.com/2012/10/difference-between-private-protected-public-package-access-java.html

让我们把它带到元级别,并假装我们是类Person实例。

我们有一些关于我们的信息 - nameagegenderweightheighthairColoreyeColor等。 大多数情况下,这是我们通过偶然互动向外界揭示的信息,因此可以将其视为“公共”信息。 我的意思是,隐藏你的eyeColor是没有意义的,除非你真的想......

现在,有一些事情我们不告诉外面的世界,但愿意告诉我们的孩子。 这些是食谱,如何解决数学问题,如何处理税,如何处理令人讨厌的分手等等。这些函数通过继承传递下来,因此,只能用祖先层次结构来引用。 我们称之为“受保护”信息,或称为解决这些问题的“受保护”方法。

还有我们只在家庭中保留的东西,比如你的小狗咀嚼了你姐姐最喜欢的娃娃的次数,或家庭遗产的地方。 我们可以通过一些文字的思考来考虑这个问题,在我们家庭的等级制度中保密。

最后,有些事情我们与其他任何人分享,但我们需要这些信息每天运作。 这就是我们认为的“私人”。

现在,该元例子的插图是访问修饰符的经典示例。

  • public表示每个人都可以看到它,并用它做他们想做的事情。 也就是说,如果你有一个public可访问的名字,那么我可以随心所欲,只需将其改为“Overflow Prime”,并且你无能为力。

  • protected表示此字段或方法仅对直接从类继承的人可见。 因此,例如, Child extends Parent意味着我可以访问Parent的受保护方法和字段。

  • “package-private”,或简称为“no modifier”,是一个只能在包的范围内访问和修改的字段或方法。 这意味着就包而言,字段是public ,但对于包外的任何内容都是完全未知的。

  • private是一个字段或方法, 只有该类的实例可以直接使用和操作。 即使有一个继承链,如果方法或字段是私有的,那么子类也无法实现它。

现在,这对你的现实世界的例子意味着什么?

比方说,例如,您的Web应用程序处理敏感信息,如财务记录。 如果我能够将每周支付支票存根的类的实例从微不足道的600美元修改为可观的79,999美元,那么我会破坏应用程序的完整性,暴露出一个重大的财务错误(从中发生了不好的事情) ),本来可以为我的麻烦做一个体面的每周检查。

这就是封装背后的想法。 我想只向外界揭示最低限度的钩子和信息,以确保我的应用程序的完整性,并确保有人不能自己削减他们不值得的支票。

以下是您的答案: https//softwareengineering.stackexchange.com/questions/143736/why-do-we-need-private-variables

简而言之,从长远来看,这是一个保持复杂性和可重用性的问题。 通过确保变量对某个类是私有的,您可以阻止其他程序员(甚至是您未来的自己)修改影响类内部的任何主要内容。

至于一个真实世界的例子,想象一下你未来的自我坐下来写下你写的一些代码并试图找出某个bug发生的位置。 经过几天的狩猎后,您确定了罪魁祸首:修改了您班级实例的成员变量。 甚至不是你,而是你的团队成员依靠这个变量。

现在你有一个大问题。 私有变量可以避免所有这些麻烦。

我试图在非常基本的代码和评论的帮助下回答这个问题。

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.
    }
}

虽然其他人已经很好地解释了这些概念,但我认为问题需要一个真实的例子。 以下是尝试解释概念。 请注意包名: 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
}

最初我分享这个以支持解释Java代码极客中的一篇文章。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM