在Java中,在创建类和接口以及处理继承时,是否有明确的规则来确定何时使用每个访问修饰符,即默认的(包私有)、公共的、受保护的和私有的?
当前回答
注:这只是对公认答案的补充。
这与Java访问修改器有关。
从Java访问修改器:
Java访问修饰符指定哪些类可以访问给定的类及其字段、构造函数和方法。访问修饰符可以为类、其构造函数、字段和方法。Java访问修饰符有时也在日常使用中使用语音作为Java访问说明符,但正确的名称是Java访问修改器。类、字段、构造函数和方法可以具有四种不同的Java访问修饰符:列表项目私有的默认(包)受保护的平民的
从控制对班级成员的访问教程:
访问级别修饰符确定其他类是否可以使用特定字段或调用特定方法。有两个级别访问控制:在顶层public或package private(没有显式修饰符)。在成员级别public、private、protected或package private(没有显式修饰符)。类可以用修饰符public声明,在这种情况下类对任何地方的所有类都可见。如果类没有修饰符(默认值,也称为包专用),它仅可见在其自己的包装内下表显示了每个成员允许的成员访问权限修改器。╔═════════════╦═══════╦═════════╦══════════╦═══════╗║ 修改器║ 班║ 包裹║ 子类║ 世界║╠═════════════╬═══════╬═════════╬══════════╬═══════╣║ 平民的║ Y║ Y║ Y║ Y║║ 受保护的║ Y║ Y║ Y║ N║║ 无修饰符║ Y║ Y║ N║ N║║ 私有的║ Y║ N║ N║ N║╚═════════════╩═══════╩═════════╩══════════╩═══════╝第一个数据列指示类本身是否有权访问由访问级别定义的成员。正如你所看到的,一个班级总是可以访问自己的成员。第二列指示是否类(无论其父母)有权访问该成员。第三列表示在该包外部声明的类的子类是否具有访问该成员。第四列指示是否所有类可以访问该成员。访问级别以两种方式影响您。首先,当您使用来自另一个源,访问级别决定您自己的这些类的哪些成员类可以使用。第二,当你写一门课时,你需要决定类中每个成员变量和每个方法的访问级别应该有。
其他回答
此图将使您轻松了解public、private、protected和default访问修饰符之间的基本区别。当您没有在代码中声明ant访问修饰符时,默认修饰符会自动发生。
简单的规则。首先声明所有内容都是私有的。然后,随着需求的出现和设计的需要,向公众迈进。
当公开成员时,问问自己是公开表示选择还是抽象选择。第一种是您需要避免的,因为它会引入太多对实际表示的依赖,而不是对其可观察行为的依赖。
作为一般规则,我试图通过子类化来避免重写方法实现;搞砸逻辑太容易了。如果要重写抽象受保护的方法,请声明该方法。
此外,在重写时使用@Override注释,以防止重构时出错。
区别可以在已经提供的链接中找到,但使用哪一个链接通常取决于“最少知识原则”。只允许所需的最小可见性。
当你想到访问修饰符时,你可以这样想(适用于变量和方法):
public-->可从任何位置访问private-->只能在声明它的同一类中访问
现在,当涉及到默认和受保护时,就会出现混乱
默认-->不存在访问修饰符关键字。这意味着它严格在类的包中可用。在该包之外,任何地方都无法访问。
protected-->略低于默认值,并且除了相同的包类之外,它可以由声明的包之外的子类访问。
我的两分钱:)
私人:
class->顶级类不能是私有的。内部类可以是私有的,可以从同一类访问。
实例变量->只能在类中访问。无法在类外部访问。
包专用:
class->顶级类可以是包专用的。它只能从同一个包访问。不是来自子包装,不是来自外包装。
实例变量->可从同一包访问。不是来自子包装,不是来自外包装。
受保护的:
class->无法保护顶级类。
实例变量->只能在同一包或子包中访问。扩展类时只能在包外部访问。
公众:
类->可从包/子包/另一个包访问
实例变量->可从包/子包/另一个包访问
下面是详细的答案
https://github.com/junto06/java-4-beginners/blob/master/basics/access-modifier.md
推荐文章
- 在流中使用Java 8 foreach循环移动到下一项
- 访问限制:'Application'类型不是API(必需库rt.jar的限制)
- 用Java计算两个日期之间的天数
- 如何配置slf4j-simple
- 在Jar文件中运行类
- 带参数的可运行?
- 我如何得到一个字符串的前n个字符而不检查大小或出界?
- 我可以在Java中设置enum起始值吗?
- Java中的回调函数
- c#和Java中的泛型有什么不同?和模板在c++ ?
- 在Java中,流相对于循环的优势是什么?
- Jersey在未找到InjectionManagerFactory时停止工作
- 在Java流是peek真的只是调试?
- Recyclerview不调用onCreateViewHolder
- 将JSON字符串转换为HashMap