黑马程序员技术交流社区
标题:
多态中的疑惑
[打印本页]
作者:
天下
时间:
2013-8-28 10:00
标题:
多态中的疑惑
本帖最后由 潘才新 于 2013-8-29 01:34 编辑
问题都在代码中。
class Fu{
public void method1(){
System.out.println("Fu1--运行");
}
public void method2(){
System.out.println("Fu2--运行");
}
}
class Zi extends Fu{
public void method1(){
System.out.println("zi复写Fu");
}
public void method3(){
System.out.println("Zi--运行");
}
}
class Duotai_3{
public static void main(String[] args){
Fu f=new Zi();
//父类引用是调用父类method1呢还是子类的method1方法呢,why?
f.method1();
//父类的引用可以调用子类的method3方法?why?
f.method3();
Zi z=new Zi();
//子类是否可以调用父类的method1方法,why?
z.method1();
//子类可以调用子类的方法,这个我明白
z.method3();
复制代码
作者:
肥猫
时间:
2013-8-28 12:26
第一个方法非静态,父类引用指向子类对象,指针动态绑定至子类方法1,F。M3报错,父类型没有M3,编译不通过,子类可以调用父的M1,SUPER就行。
作者:
黑马-马磊
时间:
2013-8-28 14:04
f.method1();//调用子类的方法,我是把多态看成伪装,左边的伪装成右边的。FU f伪装成ZI,调用的就是ZI类
f.method3();//按我的解释应该是可以调用ZI类的M3方法,实际会在编译报错。这有个前提条件,伪装可以,但你并不是他,你只能伪装你有的方法,没有的不能伪装。
zi类只能调用子类的方法,想调用父类请用super关键字!
提示:伪装只是伪装,假的就是假的不可能是真的!
作者:
黑马-张辉
时间:
2013-8-29 00:17
f.method1();//编译的时候看的父类里有没有这个方法,指针指向的是父类里的method1,但是运行的时候指针就动态绑定到子类的method1方法,看的是子类.
f.method3();//和上面的method1一样在编译时先去看父类,父类里面没有就会出错.
zi.method1();//本来就是子类的引用指向自己的对象,调用的肯定是子类的method1方法,可以通过super.method1()调用父类的方法.
总之:多态中非静态的方法,编译看左边(就是父类里有没有,没有就出错),运行时看右边(就是子类的)
调用的静态的方法都是父类的.
作者:
王广亚
时间:
2013-8-29 00:36
多态:父类引用指向子类对象是,除了调用方法是子类的,其他的像成员变量了都是父类的。
要想在子类中调用父类方法的话,一是不要复写要调用的父类那个方法;二,要是有必要复写那个父类的方法的话就创建父类引用指向父类对象,再调用。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2