JAVA中关于new子类对象时是否创建父类

在JAVA中,new子类对象时会调用父类的构造方法,这是由于每个构造方法的第一条语句默认为super()。父类的泛型数据在继承时已设置,当执行super()时传入。本文通过实例代码探讨这一过程。

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

JAVA中关于new子类对象时是否创建父类

今天在抽取dao层的重复代码到 BaseDaoImpl 里时遇到一个问题:怎样获取父类泛型的数据?

经过分析最后找到了答案,但是在查找资料的过程中还是有一些一下不解的地方(可能脑壳没有那么的灵活),这里就向大家分享一下。

下面直接向上代码:

A.java 父类
    package com.tzq.test;

    import java.lang.reflect.ParameterizedType;
    import java.lang.reflect.Type;

    import com.tzq.bos.pojo.User;

    public class A<T> {

        /*
         * 有参的父类构造方法
         */
        public A(String test) {
            System.out.println("A 的有参构造方法");
        }

        /*
         * 无参的父类构造方法
         */
        public A() {
            System.out.println("A 的无参构造方法");
            System.out.println("当前的类名 :  " + this.getClass().getName());
            ParameterizedType genericSuperclass = (ParameterizedType) this.getClass().getGenericSuperclass();//获取当前类的超类(父类 ,基类),并将其转化为 参数化样式
            Type[] actualTypeArguments = genericSuperclass.getActualTypeArguments();// 获取实际样式的参数(相当于获取到父类的泛型 数据)
            Class entityClass = (Class) actualTypeArguments[0];//获取泛型第一个数据
            System.out.println("泛型的数据 :   " + entityClass);
        }
    }
B.java A 的子类
    package com.tzq.test;

    import com.tzq.bos.pojo.User;

    public class B extends A<User> {

        public B() {
            super();// 默认是有个语句的,就算你把他删除掉!!!!!!!!!!!!!!!
                    // 调用父类的构造方法,一定要放在方法的首个语句 
        }

        public B(String test) {
            super(test);
        }

    }
Test.java
    package com.tzq.test;

    import java.lang.reflect.ParameterizedType;
    import java.lang.reflect.Type;

    public class Test {
        public static void main(String[] args) {
            System.out.println("开始new B");
            B b = new B();
        }
    }

运行Test main方法时结果:

可以看到完美的获取到泛型数据了。您可能有以下几个疑问?

一:new 子类时为什么调用了父类的构造方法?

每个构造方法的第一条语句是super(); 这是java se 的内容,所以 即使你不写,编译器在编译的时候也会为你加上。
super()方法就是调用父类的构造方法的。 自然在new子类时会调用到父类的构造方法。

为什么要这样设计呢?

仔细想想就会明白,因为构造方法体内放的是类的初始化语句。

一:父类的泛型数据是什么时候传过去的?
答:但 super();时传过去的,因为继承时已经给你父类里设置了泛型数据,但super();的自然就传过去了。

写的不好,望大神体谅。——小强
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值