面向对象编程中啥是公共的、私有的和受保护的?
Posted
技术标签:
【中文标题】面向对象编程中啥是公共的、私有的和受保护的?【英文标题】:What are public, private and protected in object oriented programming?面向对象编程中什么是公共的、私有的和受保护的? 【发布时间】:2010-11-04 11:30:28 【问题描述】:什么是面向对象编程中的公共、私有和保护?
【问题讨论】:
+1,其中一件事我觉得有点难以理解 【参考方案1】:如上,但定性:
private - least access, best encapsulation
protected - some access, moderate encapsulation
public - full access, no encapsulation
您提供的访问权限越少,从您的对象中泄漏的实现细节就越少。在不破坏对象客户端的情况下,减少这种泄漏意味着在更改对象的实现方式方面具有更大的灵活性(也称为“松散耦合”)。这是一个真正需要理解的基本问题。
【讨论】:
【参考方案2】:这三个都是在一个类中使用的访问修饰符和关键字。 public 声明的任何东西都可以被类内或类外的任何对象使用,private 中的变量只能被类内的对象使用,不能通过直接访问来更改(因为它可以通过友元函数等函数进行更改) .在受保护部分下定义的任何内容都可以被该类及其刚刚派生的类使用。
【讨论】:
【参考方案3】:总而言之,在面向对象编程中,一切都被建模为类和对象。 类包含属性和方法。 public、private 和 protected 关键字用于指定从其他类或其他 .dll 甚至其他应用程序对类的这些成员(属性和方法)的访问。
【讨论】:
【参考方案4】:它们是访问修饰符,帮助我们实现Encapsulation(或信息隐藏)。它们告诉编译器哪些其他类应该有权访问正在定义的字段或方法。
private
- 只有当前类可以访问字段或方法。
protected
- 只有该类的当前类和子类(有时也包括同包类)才能访问该字段或方法。
public
- 任何类都可以引用字段或调用方法。
假设这些关键字被用作类定义中的字段或方法声明的一部分。
【讨论】:
注意在java中同一个包的成员可以访问受保护的成员 是的,Java 还有第四个访问修饰符,即空字符串。不提供任何访问修饰符将允许从任何包级类进行访问。 我喜欢“编译器”部分,因为我知道的大多数语言都可以在运行时轻松访问所有函数/类,例如通过 .NET 中的反射。因此我倾向于说,这些访问修饰符基本上只是帮助程序员通过隐藏某些东西来指导其他程序员处理/使用相同的代码。 有些语言有一些特殊性。与 Delphi 一样,同一单元上的其他类可以访问私有成员,如果您不希望这种行为,则必须使用严格私有。 C# 也可以使用 access-protected-members-of-same-package 技巧。本质上,C# 就是微软的 Java【参考方案5】:它们不是真正的概念,而是在 C++ 和 Java 等流行语言中往往出现的特定关键字(语义略有不同)。
本质上,它们旨在允许类限制对成员(字段或函数)的访问。这个想法是,在另一种类型中允许访问的类型越少,可以创建的依赖关系就越少。这样可以更轻松地更改访问的对象,而不会影响引用它的对象。
从广义上讲,public表示允许每个人访问,private表示只允许同一类的成员访问,protected表示也允许子类的成员。但是,每种语言都为此添加了自己的东西。例如,C++ 允许您非公开继承。在Java中,还有一个默认(包)的访问级别,还有关于内部类的规则等等。
【讨论】:
【参考方案6】:公共项目是可以从任何其他类访问的项目。您只需要知道它是什么对象,就可以使用点运算符来访问它。受保护意味着一个类及其子类可以访问该变量,但不能访问任何其他类,它们需要使用 getter/setter 对变量执行任何操作。私有意味着只有该类可以直接访问变量,其他所有内容都需要方法/函数来访问或更改该数据。希望这会有所帮助。
【讨论】:
以上是关于面向对象编程中啥是公共的、私有的和受保护的?的主要内容,如果未能解决你的问题,请参考以下文章
在 C++ 中,为啥语言不强制对类/结构的公共、私有和受保护成员进行分组?
javascript 仿面向对象编程实例代码(私有,公共变量。。。)