2014-02-14 34 views
3

我是OOP的新手。访问标识符的实例[public,protected,private]

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

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

任何人都可以描述一个真实的生活的例子吗?谢谢。

+1

这不是危险的时候_you_使用它。对于有权访问您的代码的其他人来说,使用它的方式可能与您的预期不同,这是很危险的。 –

+1

注意,在java中,有*四个*隐私范围。您省略“包装范围”。没有关键字,但它非常有用。 – djeikyb

回答

1

这里是你的答案:https://softwareengineering.stackexchange.com/questions/143736/why-do-we-need-private-variables

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

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

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

+0

查找关键词:**封装**。 –

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

私人:

方法,变量和构造

方法,变量和构造函数被声明为private只能在声明类的内部访问。

私人访问修饰符是限制最多的访问级别。类和接口不能是私有的。

注意

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

保护

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

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

注意

保护访问给子类有机会使用辅助方法或变量,同时防止在尝试使用一个不相关的类。

公共

类,方法,构造器,接口等声明为public,可从其他类访问。

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

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

+1

不错的答案man(y) –

2

让我们看看它的元级代替,并且假装我们是一类Person的实例。

我们有一些关于我们的信息 - nameagegenderweightheighthairColoreyeColor,等等。大多数情况下,这是我们通过偶然相互作用向外界公开的信息,所以这可以被认为是“公共”信息。我的意思是,有没有意义的隐藏你的eyeColor除非你真的想......

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

还有一些我们只留在家里的东西,比如你的小狗咀嚼了你姐姐最喜欢的娃娃的次数,或者家庭继承的地方。我们可以考虑这一点,用一些言辞模式,在我们家庭的等级体系中保密。

最后,我们只需要不要与其他人共享,但我们需要这些信息才能每天运行。这是我们认为是“私人”的。

现在,这个元例子的例子是Access Modifiers的经典例子。

  • public表示每个人都可以看到它并按照自己的意愿去做。也就是说,如果你有一个public可访问的名字,那么我可以随心所欲地将它改为“Overflow Prime”,并且你无能为力。

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

  • “package-private”,或者简单地说“no modifier”,是一个只能在包的范围内访问和修改的字段或方法。这意味着就包装而言,这些字段为public,但对于包装以外的任何物品完全不知道。

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

现在,这是什么意思你的真实世界的例子?

比方说,例如,您的Web应用程序处理敏感信息,如财务记录。如果我能够将持有我每周薪酬支票存根的课程实例从微薄的600美元修改为79,999美元,那么我会同时损害应用程序的完整性,暴露了一个重大的财务错误(从中发现了不好的事情),并且会因为我的麻烦而被削减一次体面的每周检查。

这就是encapsulation背后的想法。我只想向外界暴露最低限度的钩子和信息,以确保我的应用程序的完整性,并确保有人不能削减自己不应该得到的支票。

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

相关问题