子类构造中有使用父类属性

本文探讨了在Java编程中,当子类构造器需要使用父类属性时,如何通过`super()`调用父类构造器进行初始化。强调在父类无无参构造器的情况下,子类必须显式调用`super(xxx)`。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

子类构造中有使用父类属性

 
在这里插入图片描述

 
 

public class Animal {
   int a;
   Animal (int a){ //看到这里要想到,此时有参构造已经代替了默认的无参构造,并且该构造方法只能在本包中的类类名创建对象
       this.a = a;
       System.out.println("Animal类的有参构造");
   }
}
class Bird extends Animal{
    int b;
    Bird(int b,int a){
        super(a);
        this.b = b;
        System.out.println("Bird extends Animal类 , Bird 是有参构造");
    }
/**
 * 编译阶段,程序会去先调用父类当中的构造器,如果此时父类的无参构造被有参覆盖,
 * 因为程序它只知道它要调用的是无参构造,没有告知程序无参已经被我们改为了有参
 * 所以,子类在写构造方法时候会报错
 * 所以,可以在子类构造这里告诉程序,说让它执行父类当中的有参构造,也就是在子类构造中引入父类当中属性
 *             让它执行父类当中的有参构造肯定是: super(属性) 现在假如这个属性是a
 *             但是,这个super(属性)中这个属性的值,怎么来
 *             (不要忘记此时,这个super是放在了子类当中的)
 *             a/属性肯定是父类当中的属性a,父类当中的属性是int类型,所以子类构造要传入一个int类型的a
 *
 */
}

class Cat extends Bird{
     int c;
     Cat(int c,int a,int b){
         super(a,b);
         this.c =c;
         System.out.println("Cat extends Bird类 , Cat 是有参构造");
     }
}

 

再比如

public class A {
    int x;
    A(int inf){
        x = inf;
    }
    void method(){
        System.out.println("A类当中的方法,值是"+x);
    }
}

class B extends A{
    double x; //子类与父类存在相同的属性名
    B(int a,double b){
        super(a); //调用A类的构造方法
        x = b;
     
    }
}




/**
 *  B(int a,double b){
 *         super(a); 
 *         x = b;
 *         
 *         把super(a) ,int a 带入变成super(int a)这个就有点类似于构造方法,
 *         只不过构造方法的名字是类名,这里是在子类中调用了父类的构造方法,把名字改为了super而已
 */

 

如果父类没有无参的构造函数,需要子类在自己的构造函数中显示的调用父类的构造函数,即不能使用系统默认的“super()”,而需要显性写出super(xxx)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值