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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 杨增坤 于 2013-10-18 20:20 编辑

class Base
{
        public Base()
        {
                test();
        }
        public void test()           //①号test方法
        {
                System.out.println("将被子类重写的方法");
        }
}
public class Sub extends Base
{
        private String name;
        public void test()        //②号test方法
        {
                System.out.println("子类重写父类的方法,"
                        + "其name字符串长度" + name.length());
        }
        public static void main(String[] args)
        {        
                Sub s = new Sub();
        }
}


以上这段代码会发生什么问题?


评分

参与人数 1技术分 +1 收起 理由
杨增坤 + 1

查看全部评分

7 个回复

倒序浏览
该段代码会发生空指针异常。 在(2)号test方法中的name.length。
Sub s = new Sub();这个构造函数一执行就会调用Base的无参构造函数。
因为Sub和Base的子类。所以子类对象一创建时,就会调用父类的无参构造函数。
而Sub又覆盖了父类的test()方法。  所以调用的是Sub这个类的test方法。
因为你没有给name赋值。所以就为null。 而null.length();就报空指针异常了

评分

参与人数 1技术分 +1 收起 理由
周志龙 + 1 赞一个!

查看全部评分

回复 使用道具 举报
非常正确
回复 使用道具 举报
本帖最后由 風諾 于 2013-10-18 14:55 编辑

代码空指针异常
即使给name赋值了,仍然空指针异常
new Sub()的时候,构造函数优先运行,此时构造函数第一行默认super()
父类构造函数运行,调用被子类复写的test()
这个时候,程序还没有执行到给name赋值,仍然是空指针异常



回复 使用道具 举报
其实就是new的时候,往堆里加载类的顺序导致的
运行时,先父类往堆里加,这时子类还没进堆,子类的name还没加进堆呢,
只不过父类Test的方法,要加子类的Test,一看name,堆里根本没得,就null,
而后再加子类进堆,才执行private String name语句,这个时候就有了
你调试下就知道了,先用的Test(),完了后,再到private String name语句。
无聊到处找题答,共勉啊
回复 使用道具 举报

加油吧,报安卓26吗?
问题有深度:D
不过还是先看完视频吧,黑马等你哦
没事的我,继续逛论坛
回复 使用道具 举报
是的是的   现在在职   一旦通过 马上辞职   
回复 使用道具 举报
斗胆潇洒 发表于 2013-10-18 15:11
加油吧,报安卓26吗?
问题有深度
不过还是先看完视频吧,黑马等你哦


是的是的   现在在职   一旦通过 马上辞职   
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马