黑马程序员技术交流社区

标题: 关于这个基础题,我感觉网友说的都不对哦! [打印本页]

作者: 刘海陆    时间: 2013-5-19 22:32
标题: 关于这个基础题,我感觉网友说的都不对哦!
本帖最后由 刘海陆 于 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的构造代码块执行了,所以他的默认构造函数也执行了");
        }
}























作者: 8047107    时间: 2013-5-19 22:36
占楼!先

额嗯嗯 这个 无法解决。。等楼下大婶回复 我只为露脸
作者: 刘海陆    时间: 2013-5-19 22:40
自己顶一下,
作者: 神之梦    时间: 2013-5-19 23:19
{:soso_e160:}
作者: 刘海陆    时间: 2013-5-19 23:26
求解亲们
作者: slatop@qq.com    时间: 2013-5-19 23:26
构造函数是为了对象初始化而产生的。当一个对象建立的时候一定构造函数被调用。如果程序员没有指定构造函数,编译器自动提供一下无参数无内容的构造函数。如果一但指定一个,无论是否有参数与内容,默认的构造函数都会被替代,
所以用构造方法的没错,
你可以这么理解,当一个子类构造对象的同时,他所有的父类包括接口都会在子类内部产生一个隐式对象。所以你写的那个也没错。
作者: 黑马伍哲沂    时间: 2013-5-19 23:33
这么说来,确实你的比较合理些。毕竟如果构造代码块运行,必然是创建了对象。而类里只有默认构造函数,所以构造函数被执行。
那貌似使用static也是可以说明这个问题了。
不过想想,貌似 也还有其它方法。比如自定义超类带参构造函数,而不定义无参构造函数。这种方法,有反证的意味了。
作者: 刘海陆    时间: 2013-5-20 00:27
我突然明白了,我把题的意思给弄错了,用自定义构造方法的 是正确的,哈哈.谢谢大家
作者: ~路@人#甲~    时间: 2013-9-10 20:21
有点意思!~
作者: 思·长安    时间: 2013-10-24 12:18
看到最后恍然大悟 {:soso_e113:}
作者: 严旭晟    时间: 2014-2-27 01:15
构造代码块  好像有问题,这个即使执行了也不等于默认构造函数执行
比方说:代码块   b:{ //代码块标记b
                               . .. ...
                             },当程序执行到代码块b跟执行到默认构造函数是两回事
网上的答案并没有错,借助显式的不带参数的构造函数更能满足题干要求。




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