在Java中,在创建类和接口以及处理继承时,是否有明确的规则来确定何时使用每个访问修饰符,即默认的(包私有)、公共的、受保护的和私有的?
当前回答
David的回答提供了每个访问修饰符的含义。至于何时使用每一个,我建议公开所有用于外部使用的类和每个类的方法(其API),并将其他所有内容私有化。
随着时间的推移,您将了解何时将某些类包设为私有,以及何时声明某些方法受保护以便在子类中使用。
其他回答
Java中最容易被误解的访问修饰符是受保护的。我们知道它类似于默认修饰符,只有一个例外,子类可以看到它?这里有一个例子,希望能澄清这一困惑:
假设我们有2个类;父亲和儿子,每个人都有自己的包装:包父包;公共课父亲{}-------------------------------------------package-sonpackage;公共课儿子延伸父亲{}让我们向Father添加一个受保护的方法foo()。包父包;公共课父亲{受保护的void foo(){}}方法foo()可以在4种上下文中调用:在位于定义foo()的同一包中的类内(父包):包父包;公共类SomeClass{公共无效方法(父f,子s){f.foo();s.foo();}}在子类内部,在当前实例上通过this或super:package-sonpackage;公共课儿子延伸父亲{public void sonMethod(){this.foo();super.foo();}}在类型为同一类的引用上:包父包;公共课父亲{公共无效父方法(父f){f.foo();//即使foo()是私有的,也有效}}-------------------------------------------package-sonpackage;公共课儿子延伸父亲{公共无效sonMethod(Sons){s.foo();}}在一个类型为父类的引用上,该引用位于定义foo()的包内(父包)[这可以包含在上下文1中]:包父包;公共课儿子延伸父亲{公共无效sonMethod(父f){f.foo();}}以下情况无效。在类型为父类且位于定义foo()的包(父包)外部的引用上:package-sonpackage;公共课儿子延伸父亲{公共无效sonMethod(父f){f.foo();//编译错误}}子类包中的非子类(子类从其父类继承受保护的成员,并使其成为非子类的私有成员):package-sonpackage;公共类SomeClass{public void someMethod(儿子)引发异常{s.foo();//编译错误}}
David的回答提供了每个访问修饰符的含义。至于何时使用每一个,我建议公开所有用于外部使用的类和每个类的方法(其API),并将其他所有内容私有化。
随着时间的推移,您将了解何时将某些类包设为私有,以及何时声明某些方法受保护以便在子类中使用。
简而言之
公共:随处可见。protected:可由同一包的类和驻留在任何包中的子类访问。默认(未指定修饰符):可由同一包的类访问。private:只能在同一类中访问。
____________________________________________________________________
| highest precedence <---------> lowest precedence
*———————————————+———————————————+———————————+———————————————+———————
\ xCanBeSeenBy | this | any class | this subclass | any
\__________ | class | in same | in another | class
\ | nonsubbed | package | package |
Modifier of x \ | | | |
————————————————*———————————————+———————————+———————————————+———————
public | ✔ | ✔ | ✔ | ✔
————————————————+———————————————+———————————+———————————————+———————
protected | ✔ | ✔ | ✔ | ✘
————————————————+———————————————+———————————+———————————————+———————
package-private | | | |
(no modifier) | ✔ | ✔ | ✘ | ✘
————————————————+———————————————+———————————+———————————————+———————
private | ✔ | ✘ | ✘ | ✘
____________________________________________________________________
此页很好地描述了受保护的默认访问修饰符(&D)
....受保护:受保护的访问修饰符有点棘手,可以说是默认访问修饰符的超集。就同一包中的访问而言,受保护的成员与默认成员相同。不同的是,受保护的成员也可以访问声明成员的类的子类,这些子类位于父类所在的包之外。
但是,这些受保护的成员“只能通过继承在包外部访问”。即,您可以直接访问某个类的子类中的受保护成员,就像该成员存在于子类本身中一样。但是,通过使用父类的引用,该受保护成员在包外部的子类中将无法访问。....
推荐文章
- 如何格式化Joda-Time DateTime仅为mm/dd/yyyy?
- 如何在POM.xml中引用环境变量?
- 如何在android中复制一个文件?
- 将整数转换为字符串,以逗号表示千
- 接口方法的最终参数-有什么意义?
- Java中的@UniqueConstraint注释
- 如何在清洁模式下运行eclipse ?如果我们这样做会发生什么?
- 获取java.lang.ClassNotFoundException: org.apache.commons.logging.LogFactory异常
- Java中的正则表达式命名组
- c#和Java的主要区别是什么?
- 什么是NullPointerException,我如何修复它?
- 在Java中使用“final”修饰符
- 无法在Flutter上找到捆绑的Java版本
- 如何在Kotlin解析JSON ?
- 如何在新的材质主题中改变背面箭头的颜色?