面向对象编程中的public、private和protected是什么?

114

在面向对象编程中,public、private和protected是什么?


+1,这是我发现有点难以理解的事情之一。 - user65663
7个回答

191
他们是访问修饰符,帮助我们实现封装(或信息隐藏)。它们告诉编译器哪些其他类应该访问正在定义的字段或方法。
私有 - 只有当前类可以访问该字段或方法。
受保护的 - 只有当前类和该类的子类(有时也包括同一包中的类)可以访问该字段或方法。
公共的 - 任何类都可以引用该字段或调用该方法。
这假定这些关键字作为类定义内部的字段或方法声明的一部分使用。

4
请注意,在Java中,同一包中的成员可以访问受保护的成员。 - Landon Kuhn
2
是的,Java还有第四个访问修饰符,即空字符串。不给出任何访问修饰符将允许从任何包级类中访问。 - Ben S
1
我喜欢“编译器”这一部分,因为我所知道的大多数语言都可以通过.NET中的反射轻松访问所有函数/类。因此,我倾向于认为,这些访问修饰符基本上只是程序员的帮助,以隐藏某些内容来指导其他正在使用/处理相同代码的程序员。 - merkuro
1
C# 也可以访问同一程序包中受保护的成员。本质上,C# 只是微软的 Java。 - Igbanam
1
封装与信息隐藏不同(这就是为什么您不得不链接到一个名称不同的维基百科文章),尽管它们在多年中已经混淆了。封装只是将方法和数据放在一起,即使它们都是公共的。就像它们被一起放在一个胶囊中,但没有人说这个胶囊不能是透明的!数据隐藏是私有成员(以及类似的技术)。 - Arthur Tacca
显示剩余5条评论

14

它们并不是真正的概念,而是在像C++和Java这样的流行语言中经常出现的特定关键字(带有略微不同的语义)。

本质上,它们旨在允许类限制对成员(字段或函数)的访问。其想法是,一个类型所允许访问的另一个类型中的内容越少,就会创建越少的依赖性。这使得可以更容易地更改已访问对象而不影响引用它的对象。

总的来说,public表示每个人都可以访问,private表示只有同一类的成员可以访问,protected表示子类的成员也被允许访问。但是,每种语言都会增加自己的东西。例如,C++允许您非公开继承。在Java中,还有默认(包)访问级别,以及有关内部类等的规则。


8

这三个关键字都是类中使用的访问修饰符。 public声明的内容可以被类内或类外的任何对象使用;private声明的变量只能被类内部的对象使用,不能通过直接访问改变(但可以通过友元函数等方式进行更改)。protected声明的内容可以被类和其派生类使用。


4

公共项是可从任何其他类访问的项。您只需要知道它是什么对象,就可以使用点运算符来访问它。受保护的意思是一个类及其子类可以访问该变量,但其他任何类都无法访问它,它们需要使用getter/setter才能对该变量执行任何操作。私有意味着只有该类直接访问该变量,其他所有内容都需要使用方法/函数来访问或更改该数据。希望这有所帮助。


4

与上述相同,但是从质量上来看:

private - least access, best encapsulation
protected - some access, moderate encapsulation
public - full access, no encapsulation

你提供的访问权限越少,对象实现细节泄露的就越少。这种泄露的减少意味着在修改对象的实现方式时不会破坏调用该对象的客户端,从而更加灵活(也称为“松耦合”)。这是一个非常基本的概念,需要深入理解。


0
总的来说,在面向对象编程中,一切都被建模成类和对象。 类包含属性和方法。 公共、私有和受保护的关键字用于指定从其他类、其他.dll甚至其他应用程序访问该类的这些成员(属性和方法)的访问权限。

0
这些是访问修饰符。 所有的数据和函数(行为)都被封装或限定在一个称为类的单个单元中。为了访问类的属性和行为,我们使用对象。但是也很重要决定哪些行为或属性必须公开或应保持对所有类可访问,哪些行为或属性必须是私有的。 因此,访问修饰符如public、private、protected和protected internal就可以帮助我们实现这一点。将特权定义给类或方法或属性的行为称为抽象化。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接