包内私有方法无法覆盖,覆盖需宽化权限
2015-05-11 15:39
134 查看
package
hack;
import click.
CodeTalk;
public class TypeIt
{
private static class
ClickIt extends
CodeTalk
{
void printMessage()
{
System.out.println("Hack");
}
}
public static void main(String[ ]
args) {
ClickIt
clickit = new ClickIt();
clickit.doIt();
}
}
package click;
public class
CodeTalk
{
public void doIt() {
printMessage();
}
void printMessage()
{
System.out.println("Click");
}
}本谜题看起来很直观。
Hack.TypeIt
的 main 方法对 TypeIt.
ClickIt
类实例化,
然后调用其 doIt 方法,该方法是从 CodeTalk
继承而来。
接着,该方法调用
printMessage 方法,它在 TypeIt.
ClickIt
中被声明为打印
Hack。然而,如果你
运行该程序,它打印的将是
Click。
怎么会这样呢?
上面的分析做出了一个不正确的假设,即
Hack.TypeIt.
ClickIt.printMessage
方法覆写了 click.
CodeTalk.printMessage
方法。一个包内私有的方法不能被位
于另一个包中的某个方法直接覆写[JLS
8.
4.
8] 。在程序中的这两个 twoMessage
方法是无关的,它们仅仅是具有相同的名字而已。当程序在
hack
包内
调用
printMessage 方法时,运行的是
hack.TypeIt.
ClickIt.printMessage
方法。这
个方法将打印 Click,这也就解释了我们所观察到的行为。
如果你想让
hack.TypeIt.
ClickIt
中的 printMessage 方法覆写在Click.
CodeTalk
中的该方法,那么你必须在
Click.
CodeTalk
中的该方法声明之前添加
protected 或 public 修饰符。要使该程序能够编译,你还必须在hack.TypeIt.
ClickIt
的覆写声明的前面添加一个修饰符,该修饰符与你在Click.
CodeTalk
的 printMessage
方法上放置的修饰符相比,所具备的限制性不
能更多[JLS 8.
4.
8.
3]
。换句话说,两个 printMessage 方法可以都被声明为是
public 的,
也可以都被声明为是 protected 的,或者,
超类中的方法被声明为
是 protected,而子类中的方法被声明为是
public 的。无论你执行了上述三种
修改中的任何一种,该程序都将打印
Hack,
从而表明确实发生了覆写。
总之,包内私有的方法不能直接被包外的方法声明所覆写。
尽管包内私有的访问
权限和覆写结合到一起会导致某种混乱,但是
Java 当前的行为是允许使用包的,
以支持比单个的类更大的抽象封装。包内私有的方法是它们所属包的实现细节,
在包外重用它们的名字是不会对包内
产生任何影响的。
hack;
import click.
CodeTalk;
public class TypeIt
{
private static class
ClickIt extends
CodeTalk
{
void printMessage()
{
System.out.println("Hack");
}
}
public static void main(String[ ]
args) {
ClickIt
clickit = new ClickIt();
clickit.doIt();
}
}
package click;
public class
CodeTalk
{
public void doIt() {
printMessage();
}
void printMessage()
{
System.out.println("Click");
}
}本谜题看起来很直观。
Hack.TypeIt
的 main 方法对 TypeIt.
ClickIt
类实例化,
然后调用其 doIt 方法,该方法是从 CodeTalk
继承而来。
接着,该方法调用
printMessage 方法,它在 TypeIt.
ClickIt
中被声明为打印
Hack。然而,如果你
运行该程序,它打印的将是
Click。
怎么会这样呢?
上面的分析做出了一个不正确的假设,即
Hack.TypeIt.
ClickIt.printMessage
方法覆写了 click.
CodeTalk.printMessage
方法。一个包内私有的方法不能被位
于另一个包中的某个方法直接覆写[JLS
8.
4.
8] 。在程序中的这两个 twoMessage
方法是无关的,它们仅仅是具有相同的名字而已。当程序在
hack
包内
调用
printMessage 方法时,运行的是
hack.TypeIt.
ClickIt.printMessage
方法。这
个方法将打印 Click,这也就解释了我们所观察到的行为。
如果你想让
hack.TypeIt.
ClickIt
中的 printMessage 方法覆写在Click.
CodeTalk
中的该方法,那么你必须在
Click.
CodeTalk
中的该方法声明之前添加
protected 或 public 修饰符。要使该程序能够编译,你还必须在hack.TypeIt.
ClickIt
的覆写声明的前面添加一个修饰符,该修饰符与你在Click.
CodeTalk
的 printMessage
方法上放置的修饰符相比,所具备的限制性不
能更多[JLS 8.
4.
8.
3]
。换句话说,两个 printMessage 方法可以都被声明为是
public 的,
也可以都被声明为是 protected 的,或者,
超类中的方法被声明为
是 protected,而子类中的方法被声明为是
public 的。无论你执行了上述三种
修改中的任何一种,该程序都将打印
Hack,
从而表明确实发生了覆写。
总之,包内私有的方法不能直接被包外的方法声明所覆写。
尽管包内私有的访问
权限和覆写结合到一起会导致某种混乱,但是
Java 当前的行为是允许使用包的,
以支持比单个的类更大的抽象封装。包内私有的方法是它们所属包的实现细节,
在包外重用它们的名字是不会对包内
产生任何影响的。
相关文章推荐
- 首页文章分类 关于 Search private(私有)方法单元测试无法覆盖?那就用反射调用来测试private(私有)方法
- 《java编程思想》之控制对成员的访问权限的原因、final、继承和组合、私有方法的“覆盖”
- 《java编程思想》之控制对成员的访问权限的原因、final、继承和组合、私有方法的“覆盖”
- 《java编程思想》之控制对成员的访问权限的原因、final、继承和组合、私有方法的“覆盖”
- private(私有)方法单元测试无法覆盖?那就用反射调用来测试private(私有)方法
- Win10简单解决修改hosts文件无法保存方法,没有权限,请于管理员联系
- 多态的缺陷:“覆盖私有方法”
- windows8系统下IE无法打开只能以管理员权限打开的解决方法
- 针对于win8、win10无法访问,您可能没有权限使用网络资源的解决方法
- “friend声明友元函数,友元函数却依旧无法访问该类的私有属性”的解决方法
- Java基础知识强化17:JAVA不可以将所覆盖的方法的访问权限变得比父类的小
- 无法访问,您可能没有权限使用网络资源的解决方法
- MySQL中配置文件my.cnf因权限问题导致无法启动的解决方法
- 解决win7和win8系统文件无法删除提示需要管理员权限、怎样获取管理员权限方法
- 在Fragment申请权限无法回调onRequestPermissionsResult方法
- Java 覆盖私有方法
- JAVA面试题:子类无法覆盖父类中的方法
- Java重载陷阱:“覆盖”私有方法
- 域用户无法操作数据库(无权限)解决方法
- XP添加权限时提示:无法显示用户选项对话框的解决方法!