黑马程序员技术交流社区
标题:
关于继承的一些问题
[打印本页]
作者:
Monster
时间:
2015-6-4 20:31
标题:
关于继承的一些问题
父类名 obj = new 子类;
obj.方法(子类覆写了的父类方法)-------最终调用的是谁的方法
父类名 obj = (父类名)new 子类;
obj.方法(子类覆写了的父类方法)-------最终调用的又是是谁的方法
原理是什么
作者:
想要那片海
时间:
2015-6-4 20:47
class AA
{
public void show()
{
System.out.println("AA");
}
}
class AB extends AA
{
public void show()
{
System.out.println("AB");
}
}
public class Demo03 {
public static void main(String[] args) {
// TODO Auto-generated method stub
AA aa=new AB();
aa.show();//运行结果"AB"
AA ab=(AA)new AB();
ab.show();// 运行结果"AB"
/* AA ab=(AA)new AB();
虽然将子类对象进行向上转型,转为父类类型,其实质上还是多态的表现形式。
和第一种将父类的引用指向子类对象的形式是一样的
*/
}
}
复制代码
作者:
Monster
时间:
2015-6-4 20:58
你这么多的技术分是怎么攥的啊,搞点技术分好难啊
只能水几个帖子赚黑马币
作者:
TOBESKY
时间:
2015-6-4 21:13
后者有个类型转换,输出的是子类
作者:
开弓没有回头箭
时间:
2015-6-4 21:22
这不就是对象的多态,子类覆盖了父类的成员,调用时就是调用子类的成员
作者:
白水丶
时间:
2015-6-4 21:28
感觉没什么区别~~
作者:
黯然残影
时间:
2015-6-4 21:41
上面的是调用子类的方法,下面的是调用父类的方法
作者:
路途遥远
时间:
2015-6-4 21:53
class Father{
void show() {
System.out.println("Father");
}
}
class Son extends Father {
void show() {
System.out.println("Son");
}
}
public class Test{
public static void main(String[] args) {
Father f = new Son();
f.show();
Father f1 = (Father) new Son();
f1.show();
}
}
复制代码
运行结果:
Son
Son
说明两个都是调用的子类的方法。
原理: 这个是父类引用指向子类对象。
编译和运行是两个独立的过程,编译时根据等号左边的类里是否有这个方法来判断对错。
比如这个程序里等号左边是Father类,有这个方法,编译通过。
但是运行时,是看等号右边的类。如果有该方法,就运行它,如果没有就查找父类的。
比如这个程序里等号右边是new Son(),所以运行时首先去Son里找方法,如果son里没有就去它的父类里找。
作者:
路途遥远
时间:
2015-6-4 22:02
父类名 obj = new 子类;
这本来就是对子类的提升,没有必要在再像这个
父类名 obj = (父类名)new 子类;
这样前面加个(父类名)。
作者:
shawdo
时间:
2015-6-4 22:11
都是多态,都是调用子类的成员方法
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2