黑马程序员技术交流社区

标题: 如何在创建子类的对象是不调用父类的构造函数? [打印本页]

作者: mulua    时间: 2013-6-14 13:06
标题: 如何在创建子类的对象是不调用父类的构造函数?
本帖最后由 mulua 于 2013-6-14 15:19 编辑

如何在创建子类的对象是不调用父类的构造函数?



主要是用来解决这一题的,第二问不知道怎么解决?
有这样三个类,Person,Student.GoodStudent。其中Student继承了Person,GoodStudent继承了Student,三个类中只有默认的构造函数,用什么样的方法证明在创建Student类的对象的时候是否调用了Person的构造函数,在创建GoodStudent类的对象的时候是否调用了Student构造函数?

如果在创建Student对象的时候没有调用Person的构造函数,那么采用什么样的手段可以调用父类的构造函数?

作者: 沐有鱼丸    时间: 2013-6-14 13:09
额 这个好像不可以 java 在创建子类对象时一定会先调用父类的构造方法  就算你不写  也会默认调用的
作者: ′х.|鰉❤耔    时间: 2013-6-14 13:10
好像如果你要在子类中调用父类的构造方法就要用到super(可带参数)通过这个来调用父类的构造方法,如果不调用这个super()方法的话就不知道了,不过一般类给实例了度会自动调用一个无参数的构造方法的。
作者: tpsu88    时间: 2013-6-14 13:32
这个不可以。
因为在继承中,子类的构造过程中必须调用父类的构造函数。
如果子类的构造函数中没有显示调用父类的构造函数,则系统默认调用父类无参数的构造函数。
如果子类构造函数中既没有显示调用父类构造函数,而且父类中又没有无参数的构造函数,则编译出错!!
希望可以帮到你!
作者: 神之梦    时间: 2013-6-14 13:49
不要去继承
作者: 蚂蚁搬家    时间: 2013-6-14 16:45
super:若在子类中对父类的方法重写或者添加同名属性,子类中的代码会自动调用子类中重写过的方法或者同名属性,为了使用父类中的方法或者属性,可以使用super;
        使用父类中的属性:super.属性名;
        使用父类中的方法:super.方法名(形参表列);
        使用父类的构造方法:super(形参表列);
每个子类,系统默认都会在其程序的第一行加上一句super(),意思是调用父类的无参构造方法;
要想不让子类调用父类的构造方法,除非 父类的构造方法是private的,因为子类是无法继承父类的私有成员的,或者说子类继承了父类的私有成员,
但是无法访问父类的私有成员;
作者: mulua    时间: 2013-6-14 16:51
蚂蚁搬家 发表于 2013-6-14 16:45
super:若在子类中对父类的方法重写或者添加同名属性,子类中的代码会自动调用子类中重写过的方法或者同名 ...

那这一题怎么解决呢
作者: 蚂蚁搬家    时间: 2013-6-14 17:03
mulua 发表于 2013-6-14 16:51
那这一题怎么解决呢

这个好像是一个基础测试题吧
第一问如何证明调用父类的构造方法?
你可以在父类的构造方法中对属性赋值,然后在子类中定义一个show方法,打印出属性的值,看是不是跟构造方法中赋的值是一样的。
第二问我上面已经写了,super(属性列表),这就是在子类中调用父类中构造方法的方式;
作者: zhouchao    时间: 2013-6-14 17:34
子类无条件地继承父类的不含参数的构造方法。    如果子类自己没有构造方法,则它将继承父类的无参数构造方法作为自己的构造方法;如果子类自己定义了构造方法,则在创建新对象时,它将先执行继承自父类的无参数构造方法,然后再执行自己的构造方法。    对于父类含参数的构造方法,子类可以通过在自己的构造方法中使用 super 关键字来调用它,但这个调用语句必须是子类构造方法的第一个可执行语句
作者: mulua    时间: 2013-6-14 22:42
蚂蚁搬家 发表于 2013-6-14 17:03
这个好像是一个基础测试题吧
第一问如何证明调用父类的构造方法?
你可以在父类的构造方法中对属性赋值, ...

第一问用构造代码块能不能证明呢
作者: mulua    时间: 2013-6-14 23:01
  1. class Person
  2. {
  3.         {
  4.                 System.out.println("这是Person类的构造函数");
  5.         }
  6. }
  7. class Student1 extends Person
  8. {
  9.         {
  10.                 System.out.println("这是Student1类的构造函数");
  11.         }
  12. }
复制代码

作者: 孙百鑫    时间: 2013-6-22 01:14
楼主您好~帖子长时间未作出回答,我已经将您的帖子改成已解决。如果有问题的话可以私密我哦~




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