目录
所谓泛型就是在类定义时不明确类型,在使用时明确类型
泛型:“<>”使用钻石操作符,<类>

- package 泛型;
-
- public class Point<T> {
- //T类型参数
-
- //此时xy的类型不确定,但保证了xy的类型一致性,xy的类型在产生对象时确定
- private T x;
- private T y;
-
-
- public T getX() {
- return x;
- }
-
- public void setX(T x) {
- this.x = x;
- }
-
- public T getY() {
- return y;
- }
-
- public void setY(T y) {
- this.y = y;
- }
-
-
- }
将泛型参数定义为String类型,将T x 转换成 String x,在给x赋整形值时就会报错。

多个泛型的使用:使用不同的大写字母来指定不同的类型。


1,编译阶段检查类型是否一致,避免向下转型的强制类型转换的出错问题。
2,代码利于重用。
- public T fun(T t){
- return t;
- }
-
- public <T> T Point(T t){
- return t;
- }
如果一个类是泛型类,泛型方法的类型参数与类的泛型参数无关。只与自己方法定义的泛型参数有关。
一个类是普通类,任然了可以定义泛型方法。但是定义的泛型方法,不能是被static修饰的 ,因为使用static修饰的类方法,无法给泛型传递泛型参数。
泛型类的泛型方法只能实例的。泛型方法在定义泛型时,使用不同的大写字母,避免产生歧义。

使用泛型参数的方法,不能被定义为静态的

泛型接口,使用<>钻石操作符定义的接口,在实现接口时,可以继续保留泛型,也可以在实现类中


三种通配符均可以设置在类和方法中。






表示最顶层的类型只能是Number和Number类的子类。



泛型:语法糖
类型擦除:泛型信息其实只在编译阶段,进入JVM后,会将所有和泛型相关的信息擦除掉。
若没有规定泛型上限,则所有的泛型信息都会被擦除为Object类型,
若规定了泛型上限,则擦除为相应的泛型上限类型。
泛型类和普通类进入JVM之后,没有任何区别
经过javac编译以后,生成*.class 文件,泛型就会消失。


一切框架的基础
在JVM运行时,
对于JVM中的任何一个类,都能动态获取该类的所有属性和方法。
对于JVM中的任何一个对象,都可以动态获取该对象的属性和方法。
反射的类型:
运行时类型:RTTI
编译时类型:
Person p = new Student();//编译时类型为Person,运行时类型为Student;
运行时类型的获取可以通过反射获取。

a,调用Class.forName(包名.类名)
b,调用类名.class获取
c,通过对象.getClass()获取。
![]()
get只能获取public修饰的属性和方法。
getDeclared...()的方法获取全部的属性和方法。




破坏封装性:

![]()
使用class关键字,包括数组,接口编译后产生的class文件就唯一对应一个Class对象,这个对象有JVM产生,使用这个对象就可以获取该类的所有信息。
![]()




![]()



