关于一个同学提问的[子类的无参构造中可以调用父类的有参构造吗]这个问题

关于一个同学提问的[子类的无参构造中可以调用父类的有参构造吗]这个问题

我尝试了一下有些情况应该是可以调用的,比如

  1. 当super中传递的参数是常量时

  2. 当super中传递的参数是子类有权限访问的父类的静态成员属性时

  3. 当super中传递的参数是子类的静态成员属性时

自己走断点看了一下执行顺序,是先找到了子类的无参构造,如果子类无参构造没有super,会找到并执行父类无参构造,再回到子类无参构造执行里面的语句;如果子类无参构造中有super,则会找到并执行super调用的父类构造方法,然后再回到子类无参构造继续从super语句后往下执行...

但是具体的细节还有点晕_(¦3」∠)_

我的理解应该是在super调用时,静态成员在类加载时就已经加载了,所以可以访问到

但是根据课上老师分析的子类实例化顺序,是父类的成员先被赋值,然后才执行父类构造方法,这样调用的时候应该是可以访问到父类的非私有普通成员的呀,为什么不行呢

希望老师能指点一下,谢谢~

// 父类Animal
public class
Animal {
   
public static String name;
   private int month;
   private String species;
   //无参构造
   public Animal() {
   }
   //带参构造
   
public Animal(String name) {
       System.
out.println(name);
   }
}
public class Dog extends Animal {
private static int sex;
   private static String test;

   public Dog() {
//        super("1");
//        super(name);
//        super(test);
​ System.out.println("hhh");
   } }


正在回答

登陆购买课程后可参与讨论,去登陆

1回答

同学你好,

1、子类的无参构造中可以调用父类的有参构造。

2、子类可以访问到父类的非私有普通成员。

例如,在父类中新增非私有普通成员age。

参考代码如下:

http://img1.sycdn.imooc.com//climg/5fcdd7ab09e1da1a03380300.jpg

在子类中访问父类中的age属性。如下:

http://img1.sycdn.imooc.com//climg/5fcdd80309828c3105200317.jpg

  • 阿姜爱学习 提问者 #1

    嗯嗯,感谢老师,我的疑问是super()调用父类构造方法时,里面的[参数],为什么不能传递父类的非私有普通成员呢?

    public class Animal {
    public static String name;
       private int month;
       private String species;
       public String hh; //非私有普通成员
       //父类的构造方法不允许被继承,不允许被重写
       public Animal() {
    System.out.println("父类无参构造");
       }
    }
    public class Dog extends Animal {
    private  int sex;
       private static String test;

       public Dog() {
    //super(super.hh); //写法一,用super调用的父类非私有普通成员,不可以
            //super(hh); //写法二,直接调用父类非私有普通成员不可以
           System.out.println("子类无参构造");
    //        super(name); //父类非私有静态成员,可以
    //        super(test); //子类静态成员,可以
       } }


    2020-12-07 15:43:15
  • 阿姜爱学习 提问者 #2

    还有,参数传递的是子类自己的普通成员,也会报错

    2020-12-07 15:45:31
  • 好帮手慕阿慧 回复 提问者 阿姜爱学习 #3

    同学你好,在super()调用父类构造方法时,父类对象还没有创建出来,不存在hh属性,所以这时不能使用super传递hh。同样,由于子类对象还没有创建出来,不存在子类中的属性,所以也不能使用子类中的属性。

    ​祝学习愉快~

    2020-12-07 18:58:43
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师