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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 焦晨光 中级黑马   /  2012-8-4 19:14  /  1470 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

class Base
{
    public Base()
    {
        test();
    }
    public void test()
    {
        System.out.println("将被子类重写的方法");
    }

}
public class Sub extends Base
{
    private String name;
    public void test()
    {
        System.out.println("子类重写父类的方法");
    }
    public static void main(String[] args)
    {
        Sub s = new Sub();//这里出现了异常,为什么,这段程序的运行顺序是怎样的,为什么会出现异常?
    }
}

2 个回复

倒序浏览
class Base
{
    public Base()
    {
        test();
    }
    public void test()
    {
        System.out.println("将被子类重写的方法");//1号test方法
    }

}
public class Sub extends Base
{
    private String name;
    public void test()
    {
        System.out.println("子类重写父类的方法");//2号test方法
    }
    public static void main(String[] args)
    {
        Sub s = new Sub();
    }
}

       当创建Sub对象时,会先执行Base类中的Base构造器,而Base构造器中调用了test方法,注意此时它并不是调用//1号test方法 而是调用//2号test方法
此时Sub对象的name属性是null,因此会引发空指针异常!!!因此,不要在父类构造器中调用被子类重写的方法  !!!!希望对你有所帮助!!!!!!{:soso_e100:}



回复 使用道具 举报
程序没什么问题呀!我编译运行了 结果是“子类重写父类的方法”,我觉得和楼上说的没有关系吧?父类调用子类已经覆盖的方法没有问题呀
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马