java学习之关于继承问题

构造器

1.父类中如果有无参构造器,在子类中的每个构造器首行都会有一个默认的隐式的super()指向父类的无参构造器。
2.如果父类中没有无参构造器,子类中的每个子类构造器的首行要显示调用父类的有参构造器,或者this调用本类构造器。

注意

在第二点这里,如果父类中没有无参构造器,在子类无参构造器中如果直接调用父类有参构造,会报错“cannot reference ‘xxx’ before supertype construct has been called”,下面是错误代码:
父类:

public class Test2 {
    private int age;
    private String name;
    
    private  Test2(){}//父类这里构造器声明为私有,子类是无法通过super()访问到的
    
    public Test2(int age,String name){
        this.age=age;
        this.name=name;
    }
    
}

子类:

public class Test2Extends extends  Test2{
     int age;
     String name;

     public Test2Extends(){
         super(age,name);//cannot reference 'xxx' before supertype construct has been called
     }
}

通过以上代码发现会报错,其实分析一下就知道,如果我们想要使用子类,肯定是先调用子类构造器创建对象,如果正好使用的是子类的无参构造器,那么一定会执行子类中的super(age,name),但重点就是,类的加载顺序,是先初始化构造器然后再初始化非静态变量,此时age name非静态变量还没有被加载,那么编译器一定会迷惑他俩是哪来的。

解决

所有静态的成员都是随着类被加载而加载,想要构造器中的两个变量提前被加载,把它声明成静态的就行呗

public class Test2Extends extends  Test2{
     static int age;
     static String name;

     public Test2Extends(){
         super(age,name);
     }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值