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

来源:互联网 发布:把别人淘宝制成csv 编辑:程序博客网 时间:2024/06/06 05:38

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();的自然就传过去了。

写的不好,望大神体谅。——小强

阅读全文
1 0
原创粉丝点击