java的父类构造调用

本文探讨了Java中实例化时为何必须调用父类构造方法的原因,指出这是为了有效利用继承并避免重复内存分配。同时,对比了JavaScript的继承实现方式。详细阐述了类的加载顺序,并通过示例展示了new操作符的两个主要步骤:调用`operator new`函数和构造函数。

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

父类构造方法调用

问题

java实例化的时候,为什么一定要调用父类的构造方法?

回答:

首先实例化就是给对象分配内存,构造方法就是分配内存的实现,那么,子类如何才能更方便的分配内存呢?很显然,就是调用父类构造方法来分配父类部分的内存,然后再调用自己的构造方法来分配子类扩展的内存。否则,如果子类完全从头开始自己分配内存,那么继承父类又有什么优点呢?因为子类的父类部分是完全和父类一样的,你觉得有必要再自己从头开始分配内存吗?既然父类的内存分配已经有现成的方法,为什么不直接调用来分配父类部分的内存呢?

扩展

javascript在实现继承的时候,也是采用了原型链的方式,将父类与子类进行挂接,而java是直接通过构造方法的层级调用,从而将new的内存挂在一起。两种实现方案不太相同。一个是通过链表找到,一个是内存共享策略。

加载顺序


class Parent {
    // 静态变量
    public static String p_StaticField = "父类--静态变量";
    // 变量(其实这用对象更好能体同这一点,如专门写一个类的实例)
  
    //如果这个变量放在初始化块的后面,是会报错的,因为你根本没有被初始化
    public String p_Field = "父类--变量";
    // 静态初始化块
    static {
        System.out.println(p_StaticField);
        System.out.println("父类--静态初始化块");
    }
    // 初始化块
    {
        System.out.println(p_Field);
        System.out.println("父类--初始化块");
    }
    // 构造器
    public Parent() {
        System.out.println("父类--构造器");
    }
}
public class SubClass extends Parent {
    // 静态变量
    public static String s_StaticField = "子类--静态变量";
    // 变量
    public String s_Field = "子类--变量";
    // 静态初始化块
    static {
        System.out.println(s_StaticField);
        System.out.println("子类--静态初始化块");
    }
    // 初始化块
    {
        System.out.println(s_Field);
        System.out.println("子类--初始化块");
    }
    // 构造器
    public SubClass() {
        //super();
        System.out.println("子类--构造器");
    }
    // 程序入口
    public static void main(String[] args) {
        System.out.println("*************in main***************");
        new SubClass();
        System.out.println("*************second subClass***************");
        new SubClass();
    }
}

输出结果

输出结果
父类–静态变量
父类–静态初始化块
子类–静态变量
子类–静态初始化块
*************in main***************
父类–变量
父类–初始化块
父类–构造器
子类–变量
子类–初始化块
子类–构造器
*************second subClass***************
父类–变量
父类–初始化块
父类–构造器
子类–变量
子类–初始化块
子类–构造器

new的基本过程

new操作符有两个动作
1 调用operator new函数
2 调用相关的构造函数

遇到异常会回滚

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值