黑马程序员技术交流社区

标题: 什么时候“被覆盖的”方法并非真的被覆盖 [打印本页]

作者: 尤圣回    时间: 2012-9-16 18:04
标题: 什么时候“被覆盖的”方法并非真的被覆盖
class Super
{
    static String greeting(){
             return "Super Say Hello";
    }
    String name(){
             return "My Name is Super";
    }
}
class Sub extends Super
{
    static String greeting(){
             return "Sub Say Hello World";
    }
    String name(){
             return "My Name is Sub";
    }
}
public class  Test
{
    public static void main(String[] args)
    {
             Super s1=new Sub();
             System.out.println("Super s1=new Sub():"+s1.greeting()+",\t"+s1.name());
             Super s2=new Super();
             System.out.println("Super s2=new Super()"+s2.greeting()+",\t"+s2.name());
             Sub s3=new Sub();
             System.out.println("Sub s3=new Sub():"+s3.greeting()+",\t"+s3.name());
             //Sub s4=new Super();//错误
             //System.out.println("Sub s4=new Super():"+s4.greeting()+",\t"+s4.name());
    }
}
结果:
Super s1=new Sub():Super Say Hello,     My Name is Sub
Super s2=new Super()Super Say Hello,    My Name is Super
Sub s3=new Sub():Sub Say Hello World,   My Name is Sub
作者: 程金    时间: 2012-9-16 18:10
本帖最后由 程金 于 2012-9-16 18:14 编辑

//Sub s4=new Super();//错误
             //System.out.println("Sub s4=new Super():"+s4.greeting()+",\t"+s4.name());

______________________
子类引用不能指向父类对象,
其次,覆盖是指,在子类中父类被覆盖的方法"不可见",而不是在父类中也"不可见",而在父类的实例中当然是调用父类对象自己的方法了
作者: 马州州    时间: 2012-9-16 19:06
这么说吧,这里涉及到的是向上转型和向下转型的问题,也就是多态,父类引用指向子类对象,而且子类复写了父类中的方法,调用的当然子类中的方法
父类中方法还在,当你用父类引用指向父类对象的时候,调用次方法就跟子类中的那个复写过的方法没什么关系了

子类引用指向子类对象的时候,当然是调用子类中的方法,无论是复写父类的还是子类特有的

总结一下就是,除了父类引用指向父类对象的时候是调用的父类的方法,其他时候都是调用的被子类复习的方法,一种情况除外,就是子类继承自父类的方法,这个时候就是调用的父类的方法了
作者: 夏天    时间: 2012-9-16 19:26
马州州 发表于 2012-9-16 19:06
这么说吧,这里涉及到的是向上转型和向下转型的问题,也就是多态,父类引用指向子类对象,而且子类复写了父 ...

正解~~~可是都25分啦,可以先给别人点机会:L
作者: 史小兵    时间: 2012-9-16 19:55
Sub s4=new Super();//错误因为这涉及到了多态的问题,在多态之中父类引用可以指向子类对象,而且子类对象可以复写了父类中的方法,但是你不像这样定义定义子类对象指向父类,这是不对的,当你使用子类复写的方法时其实父类中的方法还在。你定义的greeeting是静态的是属于类的,你用super类型的对象调用时输出super对象的greeting方法。然而name()方法不是静态的是属于对象的,因此当你使用多态来调用name()方法时,其实是调用被子类复写的方法因此输出 My Name is Sub

因此System.out.println("Super s1=new Sub():"+s1.greeting()+",\t"+s1.name());
输出Super s1=new Sub():Super Say Hello,     My Name is Sub


作者: 马州州    时间: 2012-9-16 20:50
夏诗瑶 发表于 2012-9-16 19:26
正解~~~可是都25分啦,可以先给别人点机会

额。。。。我木有想着拿分撒,就是回答一下,嘿嘿
作者: 夏天    时间: 2012-9-16 21:08
马州州 发表于 2012-9-16 20:50
额。。。。我木有想着拿分撒,就是回答一下,嘿嘿

呵呵,开玩笑的,碰巧看到你的分 而已




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2