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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 刘海陆 于 2013-5-20 00:28 编辑

有这样三个类,Person,Student.GoodStudent。其中Student继承了Person,GoodStudent继承了Student,三个类中只有默认的构造函数,用什么样的方法证明在创建Student类的对象的时候是否调用了Person的构造函数,在创建GoodStudent类的对象的时候是否调用了Student构造函数?如果在创建Student对象的时候没有调用Person的构造函数,那么采用什么样的手段可以调用父类的构造函数?

网上的答案大概是这个样子的:
class Person
{
        Person()
        {
                 System.out.println("Person  Constrcution  run");
        }

}


class  Student  extends Person
{
        Student()
        {
                 System.out.println("Student  Constrcution  run");
        }

}

class  GoodStudent  extends Person
{
        GoodStudent  ()
        {
                 System.out.println("GoodStudent  Constrcution  run");
        }
}


但是,本人感觉这样不对, 因为题干上说了,这三个类只有默认的构造函数,但是上面已经自定义了构造函数,就与题干矛盾了.

大家帮忙看看我做的对不对,我是这样理解的:因为构造代码块会优先于构造函数执行,所以在每个类中都添加一个构造代码块,
这样如果默认父类构造函数执行的话,就会先执行父类的构造代码块.所以我们可以根据构造代码块来判断,在构造代码块中加入
输出语句,这样就可以判断构造函数执行了.

class Person
{
        {
                 System.out.println("Person的构造代码块执行了,所以他的默认构造函数也执行了");
        }

}


class  Student  extends Person
{
        {
                 System.out.println("Student的构造代码块执行了,所以他的默认构造函数也执行了");
        }

}

class  GoodStudent  extends Person
{
        {
                 System.out.println("GoodStudent的构造代码块执行了,所以他的默认构造函数也执行了");
        }
}






















评分

参与人数 1技术分 +1 收起 理由
Sword + 1

查看全部评分

10 个回复

倒序浏览
占楼!先

额嗯嗯 这个 无法解决。。等楼下大婶回复 我只为露脸
回复 使用道具 举报
自己顶一下,
回复 使用道具 举报
{:soso_e160:}
回复 使用道具 举报
求解亲们
回复 使用道具 举报
构造函数是为了对象初始化而产生的。当一个对象建立的时候一定构造函数被调用。如果程序员没有指定构造函数,编译器自动提供一下无参数无内容的构造函数。如果一但指定一个,无论是否有参数与内容,默认的构造函数都会被替代,
所以用构造方法的没错,
你可以这么理解,当一个子类构造对象的同时,他所有的父类包括接口都会在子类内部产生一个隐式对象。所以你写的那个也没错。

评分

参与人数 1技术分 +1 收起 理由
Sword + 1

查看全部评分

回复 使用道具 举报
这么说来,确实你的比较合理些。毕竟如果构造代码块运行,必然是创建了对象。而类里只有默认构造函数,所以构造函数被执行。
那貌似使用static也是可以说明这个问题了。
不过想想,貌似 也还有其它方法。比如自定义超类带参构造函数,而不定义无参构造函数。这种方法,有反证的意味了。

评分

参与人数 1技术分 +1 收起 理由
Sword + 1

查看全部评分

回复 使用道具 举报
我突然明白了,我把题的意思给弄错了,用自定义构造方法的 是正确的,哈哈.谢谢大家
回复 使用道具 举报
有点意思!~
回复 使用道具 举报
看到最后恍然大悟 {:soso_e113:}
回复 使用道具 举报
构造代码块  好像有问题,这个即使执行了也不等于默认构造函数执行
比方说:代码块   b:{ //代码块标记b
                               . .. ...
                             },当程序执行到代码块b跟执行到默认构造函数是两回事
网上的答案并没有错,借助显式的不带参数的构造函数更能满足题干要求。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马