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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 张聪珉 中级黑马   /  2013-8-13 11:49  /  2105 人查看  /  13 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 张聪珉 于 2013-8-13 22:34 编辑

假如有A,B,C三个类,B继承了A,C继承了B,C能不能调用A的构造函数啊,可以应该怎么调用?

评分

参与人数 1技术分 +1 收起 理由
张智文 + 1

查看全部评分

13 个回复

倒序浏览
c可以调用b的,在b中调用a的,
回复 使用道具 举报
王靖远 发表于 2013-8-13 12:02
c可以调用b的,在b中调用a的,

这个我知道,但是不可以直接调用吧?
回复 使用道具 举报
张聪珉 发表于 2013-8-13 12:11
这个我知道,但是不可以直接调用吧?

我觉得是不可以的
回复 使用道具 举报
王靖远 发表于 2013-8-13 12:13
我觉得是不可以的

假设ABC都有空参数构造函数,在创建C对象的时候C有没有调用A的构造函数。
回复 使用道具 举报
假如某个类继承了一个类,当这个类调用构造函数初始化的时候,会先去调用父类的构造方法,所以你在调用B的构造方法的时候,其实就已经调用A的构造方法,所以你可以通过使用super关键字去调用父类的构造方法,但是必须放在子类构造方法的第一行,求加技术分啊,版主大哥,贵手抖一抖,小弟请你喝啤酒
回复 使用道具 举报
兜兜转转 发表于 2013-8-13 12:22
假如某个类继承了一个类,当这个类调用构造函数初始化的时候,会先去调用父类的构造方法,所以你在调用B的 ...

我知道啊,但是这应该不能说是直接调用而是间接调用吧?
回复 使用道具 举报
如果不加super当然是间接的,而且是还是隐式的调用
回复 使用道具 举报
兜兜转转 发表于 2013-8-13 12:34
如果不加super当然是间接的,而且是还是隐式的调用

C加上super也是先调用的B吧,然后B里的隐式super再调用A吧,加不加super()都一样,各有各的说法,所以我想知道到底是C的隐式super()直接自己去调用A,还是通过B间接调用的。
回复 使用道具 举报
1. 任何子类都不去使用super去调用父类方法,这个在任何子类对象的时候,都是隐式的调用了父类不带参数的构造方法。
2. 然后C中使用super关键去调用B的,假如B中没有使用super调用A的构造方法,那么B依然是隐式的调用了A类不带参数的构造方法,所以同理C通过B调用了A中的不带参数的构造方法。
3.然后C中使用super关键去调用B的,假如B中使用super调用A的任何带参数或不带参数构造方法,那么B这时就是显式的调用了的构造方法,所以同理C通过B调用了A中的指定构造。
回复 使用道具 举报
  1. class A {
  2.         A(){
  3.                 System.out.println("AAAAAAAAAAAAAAA");
  4.         }
  5.         A(int a){
  6.                 System.out.println("AAAAAAAAAAAAAAA");
  7.         }
  8. }

  9. class B extends A{
  10.         B(){
  11.                 super();
  12.                 System.out.println("BBBBBBBBBB");
  13.         }
  14.         B(String str){
  15.                 super();
  16.                 System.out.println("BBBBBBBBBB");
  17.         }
  18. }

  19. class C extends B{
  20.         C(){
  21.                 super("1");//可以编译通过,也能打印出AAAAAAAA;super(1)编译不能通过,说明不能直接在C中调用A的构造函数。
  22.                 System.out.println("CCCCCCCCCC");
  23.         }
  24.         public static void main(String[] args) {
  25.                 C c = new C();
  26.         }
  27. }
复制代码
以上是写的一个测试程序,结果表明不能直接通过C调用A中的构造函数
回复 使用道具 举报
亲,如问题已解决请将分类的未解决改为已解决。

以后的问题贴也要及时更改分类哦~


保持队形,谢谢合作
回复 使用道具 举报
杨璐敏 发表于 2013-8-13 22:29
亲,如问题已解决请将分类的未解决改为已解决。

以后的问题贴也要及时更改分类哦~

好的,谢谢提醒哈
回复 使用道具 举报
张聪珉 发表于 2013-8-13 22:34
好的,谢谢提醒哈

恩恩

以后要记得保持队形哈

:loveliness:
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马