黑马程序员技术交流社区
标题:
在父类中被定义为private final 的方法似乎可以被子类覆盖?
[打印本页]
作者:
彭彪
时间:
2013-9-23 12:38
标题:
在父类中被定义为private final 的方法似乎可以被子类覆盖?
本帖最后由 彭彪 于 2013-9-24 20:10 编辑
package com.study;
class Parents{
private final void doit(){
System.out.println("父类.doit()");
}
final void doit2(){
System.out.println("父类.doit2()");
}
public void doit3(){
System.out.println("父类.doit3()");
}
}
class Sub extends Parents{
public final void doit(){ //在子类中定义一个doit()方法
System.out.println("子类.doit()");
}
// final void doit2(){ //final方法不能覆盖
// System.out.println("子类.doit2()");
// }
public void doit3(){
System.out.println("子类.doit3()");
}
}
public class FinalMethod {
public static void main(String[] args) {
Sub s = new Sub(); //实例化
s.doit(); //调用doit()方法
Parents p = s; //执行向上转型操作
// p.doit(); //不能调用private方法
p.doit2();
p.doit3();
}
}
复制代码
从实例可以看出,final 方法不能被覆盖,例如,doit2()方法不能在子类中被重写,但在父类中定义了一个private final 的doit()方法,同时在子类中也定义了一个doit()方法?
搜狗截图20130923123107.png
(58.03 KB, 下载次数: 61)
下载附件
2013-9-23 12:33 上传
作者:
yangxin540
时间:
2013-9-23 12:54
哥们,这肯定不行呀,不能覆盖,这就是两个方法而已,你不行你给子类那个方法上加上@Override
作者:
lizhangzhi
时间:
2013-9-23 13:13
子类中的doit()方法,是子类的一个特有方法,不是覆盖父类的doit()方法,把父类doit()前的private 改成public,这是子类覆盖父类的doit()方法,编译就不能通过了;
作者:
jìng╮煜
时间:
2013-9-23 14:04
哥们,private你就当他是隐身宝石就行. 只在本类中能被调用.所以除了本类的话,其他类是看不到的.
作者:
wrswuxiaoyan
时间:
2013-9-23 16:47
public class FinalMethod {
public static void main(String[] args) {
Sub s = new Sub(); //实例化
s.doit(); //
调用doit()方法,这里输出的结果是“父类.doit()");”
Parents p = s; //执行向上转型操作
// p.doit(); //不能调用private方法
p.doit2();
p.doit3();
}
}
Sub类的doit()方法并不能覆盖父类Parents的doit()方法,这两个doit()方法之间并不存在覆盖关系。由于,父类Parents的doit()方法是private的,JVM首先在sub实例对象时无法找到匹配的doit()方法,所以就直接调用其父类的doit()方法。
不光是private的方法不能重载,static, final都不能重载
。
作者:
暮雨
时间:
2013-9-23 18:31
这样解释吧,带有private的父类doit方法,应该看作是父类私有的方法,不存在覆盖的问题,因为你根本看不到。而没有加private修饰的doit2默认是friend限制级别,可以覆盖,所以在子类中写doit2方法编译不通过。
作者:
chensc
时间:
2013-9-24 09:15
学习学习!
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2