Java构造器的小事情

本文通过几个具体的代码示例,详细解释了在Java中如何处理子类与父类之间的构造器调用问题。重点介绍了当父类存在无参构造器时,子类如何实例化;以及当父类没有无参构造器时,子类应该如何定义自己的构造器来确保正确实例化。

 关于子类与父类的构造器的小事情一直不是很了解,今天专门抽出空写几行代码,亲自搞清楚,这样印象比较深刻吧.
 首先,构造器是针对类来讲的.
 1.任意一个只继承java.lang类的类.不指定构造器将被由系统自动生成无参的构造器.
比如:

public class Animals(){
}

测试类:

public static void main (String[] args){
    Animals cat = new Animals();
    }

.
.
2.子类的实例化中,会先执行父类无参构造方法,再执行自己的

public class Animals(){
    System.out.println("Animals的构造方法被执行了");
    }
public class Cat extends Animals(){
    }
public static void main(String[] args){
    Cat myCat = new Cat();
    }//结果输出"Animals的构造方法被执行了"

.
.
.
3.父类的构造器不是 无参构造器 时,系统会擦除默认给定的无参构造器.此时,子类对象无法通过无参构造器实例化父类对象,进而实例化自己,必须也要指定显式的构造器给子类

public class Animals{
    public Animals( int i){
    System.out.println("i");
        }
    }
//这样写会报错:
//implict super constructor Animals() is undefined for 
//    default  constructor.Must define an explict 
//    constructor
//Cat的默认构造器无法调用Cat父类无参构造方法Animals().必须要为
//   Cat类显式调用一个构造器
//implict翻译成无参构对不?有点尴尬.要是隐式构造器我就呵呵了
public class Cat{
    }

可以看出,主要是父类无参构造器被擦除了.只要有父类有无参构造器,子类便能正常实例化

public class Cat{
    public Cat(){
    //使用super关键字,写入参数.自动进行方法的重载.
    super.(1);
        }
    }
### Java 构造函数概念 构造函数是一种特殊的方法,在创建对象时自动调用,用于初始化新创建的对象状态。构造函数的名字必须与类名相同,并且不具有返回值[^1]。 #### 特殊性质 - **无返回类型声明**:即使实际上可以隐含地返回 `this` 对象引用,但在语法上不允许显式指定返回类型。 - **名字需匹配类名**:这是识别构造器的关键特征之一。 ### 类型分类 根据参数的不同,构造函数主要分为三类: - **无参构造函数** - 当未定义任何构造函数时,默认提供一个无参构造函数。 - 明确编写也可以自定义行为而不仅仅是简单初始化。 - **带参构造函数** - 接受一个或多个参数来设置对象的状态。 - 支持重载机制允许存在多个不同签名的构造函数版本。 - **默认构造函数** - 如果没有任何其他构造函数被定义,则编译器会自动添加一个不做任何事情也不接受任何参数的构造函数。 ```java // 定义了一个简单的Person类并展示了三种类型的构造函数 public class Person { private String name; private int age; // 默认构造函数 (如果省略此部分也会由JVM提供) public Person() {} // 带参构造函数 public Person(String name, int age) { this.name = name; this.age = age; } // 无参构造函数示例 public Person(){ System.out.println("这是一个无参构造"); } } ``` ### 继承中的表现形式 当涉及到继承关系时,子类不会继承父类的构造函数;然而,为了确保完整的初始化过程,通常会在子类构造函数的第一条语句中使用 `super()` 来显示调用父类的某个构造函数[^3]。 ```java class Animal{ protected void sound(){System.out.println("Animal Sound");} } class Dog extends Animal{ // 调用了父类的无参构造函数 public Dog(){ super(); } @Override protected void sound(){ System.out.println("Dog Barks"); } } ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值