当new一个时,如果父类还没有被初始化,会先对其父类先初始化
如果已经初始化了,会先执行父类的构造器
泛型只存在于编码阶段,在运行阶段会被擦除,目的是为了兼容老版本的jdk
泛型的通配符为“?”,泛型的通配符使用的上边界以及下边界问题
extends 上边界 当需要读取,但不需要写入
super 下边界 当需要写入,但不需要读写
public class People<T> { private T name; public T getName() { return name; } public void setName(T name) { this.name = name; } }
public class People2<K,V> { private K name; private V age; public K getName() { return name; } public void setName(K name) { this.name = name; } public V getAge() { return age; } public void setAge(V age) { this.age = age; } }
其中可以指定为任意类型
People<String> people = new People<>(); people.setName("happy");
People2<String, Integer> people2 = new People2<>(); people2.setName("happy"); people2.setAge(12);
静态的泛型方法需要自己声名占位符,与类的占位符无关,同理,普通方法也可以自定义
public class People3<T>{ public void show(T name){ System.out.println(name); } public T show2(T name){ return name; } public <M> M show3(M name){ return name; } public static <E>void showStatic(E name){ System.out.println(name); } public static <V> V showStatic2(V name){ return name; } }
People3<String> people3 = new People3<>(); people3.show("11111"); System.out.println(people3.show2("返回值的普通泛型方法")); People3.showStatic("happyStatic"); System.out.println(People3.showStatic2(111));
1:其实现类给接口指定类型
2:实现类也声明一个泛型
@Target({ElementType.TYPE,ElementType.METHOD})//表示注解的作用域
@Retention(RetentionPolicy.RUNTIME)//什么时候生效
@Documented//表示方法已经过时,但是还能用
@Inherited//表示子类可以继承
public @interface MyAnnotation {
String value() default "";
}
一个类只有一个class对象
类被加载后,类的整个结构都被封装在class对象中
通过路径
Class<?> c1 = Class.forName("com.smu.User");
Class<? extends User> aClass = user.getClass();
Class<User> userClass = User.class;
Class<Integer> type = Integer.TYPE;
获取类名
获取字段(带有Declared的是获取包括private的字段)
获取方法(不带Declared是获取本类以及父类的public方法,带有Declared的是获得本类的所有包括private的方法)
获取构造器
获取对象
通过class对象获取(需要有无参构造器,需要是public修饰的),通过构造器获取,如果是private修饰的需要setAccessible(true);
执行方法
可以通过类对象调用私有方法,也可以直接通过class对象获取方法