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