2 sinat 34046671 sinat_34046671 于 2016.04.20 22:44 提问

马士兵教程里的一个问题

interface Singer {
public void sing();
public void sleep();
}

interface Painter {
public void paint();
public void eat();
}

class Student implements Singer {
private String name;
Student(String name) {
this.name = name;
}

public void sing() {
System.out.println("student is singing");
}

public void sleep() {
System.out.println("student is sleeping");
}
}

class Teacher implements Singer,Painter {
private String name;
Teacher(String name) {
this.name = name;
}
public void sing() { System.out.println("teacher is singing"); }
public void sleep() { System.out.println("teacher is sleeping"); }
public void paint() { System.out.println("teacher is painting"); }
public void eat() { System.out.println("teacher is eating"); }
}

public class Test {
public static void main(String args[]) {
Singer s1 = new Student("chenfei");
s1.sing();s1.sleep();s1.study();
Singer s2 = new Teacher("xiong");
s2.sing();s2.sleep();
Painter p1 = (Painter)s2;
p1.paint();p1.eat();
}
}

这个程序里 Painter p1 = (Painter)s2; 这句话将s2这个Teacher对象强制转换成painter类,那么p1就指向一个painter类对象了,就不存在基类引用指向子类对象了,为什么下面的p1.paint();这个方法还能执行出teacher is painting呢??

2个回答

caozhy
caozhy   Ds   Rxr 2016.04.20 22:52

对于函数覆盖来说,执行的是这个对象实际类型(用new创建的那个对象类型)拥有的方法,而不是你引用类型的方法。
这个你应该从面向对象的设计的角度去思考,而不是纠结在语法和具体编译器实现的层面。
派生类覆盖基类的函数,这个语法的实际用途是允许对类库调用的外围程序员改变基类代码的行为。而编写类库的程序员肯定不知道外围程序员所定义的类型
所以不管是什么语言,C++ Java Python还是什么,都必须是实际类型的方法覆盖引用类型的方法,这样的编程语言才有实用的用途。
好比不管是电动车、混动车、汽油车、柴油车,都要具有踩下油门踏板让车往前行驶的功能。你用不着去理解汽油机、柴油机、电动机的原理,你买车就是开的。
同样编程语言就是用来写程序的。

CSDNXIAOD
CSDNXIAOD   2016.04.25 13:16

一个叫 马士兵 的
----------------------biu~biu~biu~~~在下问答机器人小D,这是我依靠自己的聪明才智给出的答案,如果不正确,你来咬我啊!

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
马士兵servlet&jsp视频教程——第二部分jsp笔记及源代码、servlet和jsp的通信
当时学servlet和jsp时,主要还是看马士兵的视频然后结合下面的这些笔记和源代码进行 当然自己也有记笔记,但是没他们整理的有条理,特此转载下! 1.最简单的JSP  HelloWorld.jsp              Hello                                     out.println("Hello World!");
马士兵教程—《坦克大战》游戏设计思路
马士兵教程—《坦克大战》游戏设计思路 版本0.1     功能:产生一个窗口   版本0.2     功能:添加关闭窗口的事件处理                不允许窗口的大小改动   版本0.3        功能:画出代表坦克的实心圆   版本0.4        功能:让坦克运动起来        步骤: 将位置改变为变量 启动线程不断重画
[zz] JAVA自学之路&马士兵教程观看顺序
JAVA自学之路 七:路线图明细 下面给出第二节《JAVA自学路线图》中知识点的明细: 一:J2SE 面向对象-封装、继承、多态 内存的分析 递归 集合类、泛型、自动打包与解包、Annotation IO  多线程、线程同步  TCP/UDP  AWT、事件模型
马士兵学JAVA系列教程下载
马士兵学JAVA系列教程下载 http://www.sql8.net/html/download/video/java/2013/0307/5905.html 马士兵java自学之路 - 马士兵_JAVA 自学之路 马士兵 JAVA 自学之路 一:学会选择 为了就业,不少同学参加各种各样的培训. 决心做软件的,大多数人选的是 java,... 视频教程 JAVA尚学堂马士兵_设计模式
马士兵Java自学之路——(精华版)
目录 JAVA自学之路 一: 学会选择 2 JAVA自学之路 二: JAVA自学路线图 3 JAVA自学之路 三: 要动手 3 JAVA自学之路 四: 要事为先 4 JAVA自学之路 五: 问题解决之道 6 1:要仔细的观察错误的现象,是的,要仔细 6 2:要仔细思考问题会出在哪些环节(重要) 6 3:如何定位错误(重要)分析清楚有哪些环节之后,下一步就
尚学堂马士兵JAVA集视频教程(J2EE)
《尚学堂科技.马士兵.JAVA集视频教程14年11月20日更新》 http://www.verycd.com/topics/93279/《09尚学堂马士兵网络课堂之设计模式系列[陆续更新。。。]》http://www.verycd.com/topics/2765241/《传智播客:spring2.3\jdbc\EJB3.0\ajax\hibernate\Struts\java视频教程》(SPRIN
马士兵教你如何面试(记录原话)
//2015年5月2日 //重要的是展现自己! 一、不要只回答对与错 应试教育害死人,拿到问题就在不停地想,到底是对还是错; 其实对错不是很重要,重要的是为什么对,为什么错。 这样回答的话就算你回答不出,也比交白卷的人好。 i+=i++结果如何 答:我项目写的比较多,一般不会这么写。我知道这是编译器,虚拟机方面的知识,给我点时间,我再去看一个XX书,应该能解决这个问题。 二
WebService 教程
http://wenku.baidu.com/view/82bd542b647d27284b73513c.html http://wenku.baidu.com/view/face1f2c453610661ed9f4ea.html 侯捷那本《深入浅出MFC》 Eclipse remote debug for websphere.doc  关于websphere的debug的文档
马士兵java课程的学习顺序
第一部分:J2se学习视频内容包括: 尚学堂科技_马士兵_JAVA视频教程_JDK5.0_下载-安装-配置 尚学堂科技_马士兵_JAVA视频教程_J2SE_5.0_第01章_JAVA简介_源代码_及重要说明 尚学堂科技_马士兵_JAVA视频教程_J2SE_5.0_第02章_递归补充 尚学堂科技_马士兵_JAVA视频教程_J2SE_5.0_第02章_基础语法 尚学堂科技_马士兵_J
马士兵-Hadoop环境的搭建
马士兵老师是一位很棒的老师。。灰常感谢老师的课程分享。 (一)搭建Hadoop环境需要安装:VMware ,centos7 ,hadoop-2.7.3.jar  jdk8 ,xshell ,Xftp(我用得WinSCP。。因为原来有,懒得再装xftp了~~)。 (二)虚拟机的安装与配置。      设置虚拟机网络前,先设置宿主机的VMware Network Adapter VMne