在Java中,在创建类和接口以及处理继承时,是否有明确的规则来确定何时使用每个访问修饰符,即默认的(包私有)、公共的、受保护的和私有的?
当前回答
当谈到访问修饰符时,我们很容易理解,非常简单的规则包括它们。
专用访问修饰符用于:-仅同一类
默认Access修饰符用于:-仅同一类/同一包子类
Protected Access修饰符用于:-同一类/同一包子类/同包非子类/不同包子类
公共访问修饰符用于:-我们可以在任何地方使用(相同的类/相同的包子类/相同包非子类/不同的包子类别/不同包非子类别)
其他回答
简而言之
公共:随处可见。protected:可由同一包的类和驻留在任何包中的子类访问。默认(未指定修饰符):可由同一包的类访问。private:只能在同一类中访问。
包装可见。默认值。不需要修改器。
仅对类可见(私有)。
对世界(公众)可见。
对包和所有子类可见(受保护)。
变量和方法可以在不调用任何修饰符的情况下声明。默认示例:
String name = "john";
public int age(){
return age;
}
私有访问修饰符-私有:
声明为私有的方法、变量和构造函数只能在声明的类本身内访问。私有访问修饰符是限制性最强的访问级别。类和接口不能是私有的。
如果类中存在公共getter方法,则可以在类外部访问声明为私有的变量。
使用私有修饰符是对象封装自身并向外界隐藏数据的主要方式。
示例:
Public class Details{
private String name;
public void setName(String n){
this.name = n;
}
public String getName(){
return this.name;
}
}
公共访问修饰符-Public:
声明为公共的类、方法、构造函数、接口等可以从任何其他类访问。因此,在公共类中声明的字段、方法和块可以从属于Java世界的任何类访问。
但是,如果我们试图访问的公共类位于不同的包中,那么仍然需要导入公共类。
由于类继承,类的所有公共方法和变量都由其子类继承。
例子:
public void cal(){
}
受保护的访问修饰符-受保护的:
在超类中声明为受保护的变量、方法和构造函数只能由另一个包中的子类或受保护成员类的包中的任何类访问。
受保护的访问修饰符不能应用于类和接口。方法、字段可以声明为受保护,但接口中的方法和字段不能声明为受。
受保护的访问使子类有机会使用helper方法或变量,同时防止非相关类尝试使用它。
class Van{
protected boolean speed(){
}
}
class Car{
boolean speed(){
}
}
这是该表的一个更好的版本,其中还包括一个模块列。
解释
私有成员(i)只能在声明的同一类中访问。没有访问修饰符(j)的成员只能在同一包中的类中访问。受保护的成员(k)可以在同一包中的所有类和其他包中的子类中访问。公共成员(l)对所有类都是可访问的(除非它驻留在不导出声明它的包的模块中)。
要选择哪个修饰符?
访问修饰符是一种帮助您防止意外破坏封装(*)的工具。问问自己,您是否希望成员是类、包、类层次结构的内部成员,或者根本不是内部成员,并相应地选择访问级别。
示例:
长字段internalCounter可能应该是私有的,因为它是可变的,并且是实现细节。只应在工厂类中实例化的类(在同一个包中)应具有包限制构造函数,因为不可能从包外部直接调用它。应保护在呈现之前调用并用作子类中钩子的内部void beforeRender()方法。从GUI代码调用的void saveGame(File dst)方法应该是公共的。
(*)封装到底是什么?
平民的如果用public声明类成员,则可以从任何地方访问它受保护的如果用关键字protected声明类成员,则可以从相同的类成员、同一包内的外部类成员和继承的类成员访问该类成员。如果类成员受到保护,则不能从外部包类访问它,除非外部包类被继承,即扩展其他包超类。但是,受保护的类成员始终可用于相同的包类,无论是否继承了相同的包类别违约在Java中,默认值不是访问修饰符关键字。如果声明的类成员没有任何访问修饰符关键字,那么在这种情况下,它被视为默认成员。默认类成员始终可用于相同的包类成员。但即使外部类是与受保护成员不同的子类,外部包类成员也不能访问默认类成员私有的如果用关键字protected声明了类成员,那么在这种情况下,它只对相同的类成员可用
当谈到访问修饰符时,我们很容易理解,非常简单的规则包括它们。
专用访问修饰符用于:-仅同一类
默认Access修饰符用于:-仅同一类/同一包子类
Protected Access修饰符用于:-同一类/同一包子类/同包非子类/不同包子类
公共访问修饰符用于:-我们可以在任何地方使用(相同的类/相同的包子类/相同包非子类/不同的包子类别/不同包非子类别)
推荐文章
- Java 8接口方法中不允许“同步”的原因是什么?
- 如何找到Java堆大小和内存使用(Linux)?
- 使用Enum实现单例(Java)
- RabbitMQ与通道和连接之间的关系
- buildSessionFactory()配置方法在Hibernate中已弃用?
- Spring MVC -如何获得所有的请求参数在一个地图在Spring控制器?
- 如何在Java中按两个字段排序?
- 文件之间的差异。路径中的分隔符和斜杠
- 在方法参数中使用NotNull注释
- Spring MVC中处理可选参数的@RequestParam
- Tomcat:如何查找正在运行的Tomcat版本?
- “java”、“javaw”和“javaws”之间有什么区别?
- 将Date对象转换为日历对象
- 在Java中保存最后N个元素的大小有限的队列
- 如何运行一个类从Jar不是主类在其清单文件