《零基础学Java》第7章 实例15,书中对代码的点评是什么意思呢?代码如下

student_w 2019-09-12 10:28:47
实例15 父类中的final方法能否被子类覆盖
在项目中创建FinalMethod类,在该类中创建Parents类和继承该类的Sub类,在主方法中分别调用这两个类中的方法,并查看final类型方法能否被覆盖。代码如下:
class Parents{
private final void doit(){
System.out.println("父类.doit()");
}
final void doit2(){
System.out.println("父类.doit2()");
}
private 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(); //实例化Sub类
s.doit(); //调用doit()方法
Parents p = s; //执行向上转型操作
//p.doit(); //不能调用private方法
}
}


运行结果:
子类.doit()
父类.doit2()
子类.doit3()

点评如下,什么意思看不明白了,小白太痛苦了,求大佬赐教!最好逐句解析,感谢
从本实例中可以看出,final方法不能被覆盖。例如,doit2()方法不能在子类中被重写,但是在父类中定义了一个private final的doit()方法,同时在子类中也定义了一个doit()方法,从表面上来看,子类中doit()方法覆盖了父类的doit()方法,但是覆盖必须满足一个对象向上转型为它的基本类型并调用相同方法这样一个条件。又如,在主方法中使用“Parents p = s;”语句执行向上转型操作,对象p只能调用正常覆盖的doit3()方法,却不能调用doit()方法,可见子类中的doit()方法并不是正常覆盖,而是生成一个新的方法。
...全文
145 3 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
student_w 2019-09-12
  • 打赏
  • 举报
回复
我去,,太蠢了。最不理解的两句代码被我漏贴了,,,就是31行和32行p.doit2()和p.doit3(),为什么p.doit3()的结果是子类.doit3()?既然向上转型成功,为什么结果不是父类.doit3()??不知道我是哪理解错了,总之现在太困惑了......
class Parents{
private final void doit(){
System.out.println("父类.doit()");
}
final void doit2(){
System.out.println("父类.doit2()");
}
private 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(); //实例化Sub类
s.doit();  //调用doit()方法
Parents p = s; //执行向上转型操作
//p.doit(); //不能调用private方法
p.doit2();
p.doit3();
}
}
我刚开始学重写的概念时是看的下面这个例子,这里边重写的条件没有说必须满足向上转型成功才可以啊,不懂,还请大佬看下这个例子: 实例03 在电脑类中展示图片 平板电脑类是普通电脑类的子类,当用户想欣赏放大后的美图时,它们都会以各自的方式(普通电脑通过鼠标点击展示图片,平板电脑通过手指点击触摸屏展示图片)展示图片满足用户的需求。代码如下:
class Computer2{  //父类:电脑
void showPicture(){  //方法:展示图片
System.out.println("鼠标点击");
}
}

public class Pad2 extends Computer2{  //子类:平板电脑
void showPicture(){  //方法:重写父类中展示图片的方法
System.out.println("手指触摸点击触摸屏");
}
public static void main(String[] args){
Computer2 pc = new Computer2();  //创建电脑类对象
System.out.print("pc打开图片: ");
pc.showPicture();  //电脑类对象调用展示图片的方法
Pad2 ipad = new Pad2();  //创建平板电脑类对象
System.out.print("ipad打开图片: ");
ipad.showPicture(); //平板电脑类对象调用重写后父类方法
}
}
运行结果: pc打开图片:鼠标点击 ipad打开图片:手指点击触摸屏
oh_Maxy 2019-09-12
  • 打赏
  • 举报
回复 1
我觉得你的理解没问题啊。
语法这个东西,没有道理可言,记住就行了。

比如父类的私有方法,子类中不能调用,它就是这么规定的。
silent_xiangyang 2019-09-12
  • 打赏
  • 举报
回复 1
你把final修饰的东西当成固定的就好不可改变

81,122

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧