A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

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

评分

参与人数 1技术分 +1 收起 理由
创出一片辉煌 + 1 赞一个!

查看全部评分

6 个回复

倒序浏览
本帖最后由 程金 于 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
这么说吧,这里涉及到的是向上转型和向下转型的问题,也就是多态,父类引用指向子类对象,而且子类复写了父 ...

正解~~~可是都25分啦,可以先给别人点机会:L
回复 使用道具 举报
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

评分

参与人数 1技术分 +1 收起 理由
创出一片辉煌 + 1 赞一个!

查看全部评分

回复 使用道具 举报
夏诗瑶 发表于 2012-9-16 19:26
正解~~~可是都25分啦,可以先给别人点机会

额。。。。我木有想着拿分撒,就是回答一下,嘿嘿
回复 使用道具 举报
夏天 初级黑马 2012-9-16 21:08:26
7#
马州州 发表于 2012-9-16 20:50
额。。。。我木有想着拿分撒,就是回答一下,嘿嘿

呵呵,开玩笑的,碰巧看到你的分 而已
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马