泛型 枚举 反射 动态代理 类加载 类的生命周期--复习笔记

泛型  Java中没有所谓的泛型数组一说

list<E> E表示类型形参 可以接受具体的类型实参;

泛型接口 泛型类 泛型方法

public Interface ITest<T>

public class Text<E>  public void text(T t)

Box name =new Box("corn");

Box age =new Box(712);  

System.out.println("name class:" + name.getClass());//com.qqyumidi.Box

System.out.println("age class:" + age.getClass());//com.qqyumidi.Box

System.out.println(name.getClass() == age.getClass());//true

泛型类型在逻辑上看以看成是多个不同的类型,实际上都是相同的基本类型。类型通配符一般是使用 ? 代替具体的类型实参

且Box在逻辑上是Box、Box>...等所有Box<具体类型实参>的父类

类型通配符上限和类型通配符下限

类型通配符上限通过形如Box<? extends Number>形式定义 ; 类型通配符下限为Box<? super Number>形式,其含义与类型通配符上限正好相反

在泛型接口、泛型类和泛型方法的定义过程中,我们常见的如T、E、K、V等形式的参数常用于表示泛型形参

通配符 ?  通配符?表示该集合存储的元素类型未知,可以是任何类型。  

边界通配符 List<?exends Number>  如果你想从一个数据类型里获取数据,使用? extends通配符

<?super Number>通配符  如果你想把对象写入一个数据结构里,使用<?superNumber> 通配符 

 如果你既想存,又想取,那就别用通配符。

枚举

用法一:常量

用法二:switch

用法三:向枚举中添加新方法

JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。

反射调用一般分为3个步骤:

得到要调用类的class

得到要调用的类中的方法(Method)

方法调用(invoke)

JAVA反射的常规使用步骤

动态代理    动态代理是设计模式当中代理模式的一种

代理模式的作用是:为其他对象提供一种代理以控制对这个对象的访问。

代理模式有什么好处? 

在某些情况下,一个客户不想或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。

动态代理的作用

 1--Proxy类的代码量被固定下来,不会因为业务的逐渐庞大而庞大;

 2--可以实现AOP编程,实际上静态代理也可以实现,总的来说,AOP可以算作是代理模式的一个典型应用;

 3--解耦,通过参数就可以判断真实类,不需要事先实例化,更加灵活多变。

类的生命周期

在一个类编译完成之后,下一步就需要开始使用类,如果要使用一个类,肯定离不开JVM。在程序执行中JVM通过装载,链接,初始化这3个步骤完成。

类的装载 是通过类加载器完成的,加载器将.class文件的二进制文件装入JVM的方法区,并且在堆区创建描述这个类的java.lang.Class对象。用来封装数据。但是同一个类只会被类装载器装载一次

链接就  是把二进制数据组装为可以运行的状态。

            链接分为校验,准备,解析这3个阶段

校验一般用来确认此二进制文件是否适合当前的JVM(版本),

准备就是为静态成员分配内存空间,。并设置默认值

解析指的是转换常量池中的代码作为直接引用的过程,直到所有的符号引用都可以被运行程序使用(建立完整的对应关系)

完成之后,类型也就完成了初始化,初始化之后类的对象就可以正常使用了,直到一个对象不再使用之后,将被垃圾回收。释放空间。

当没有任何引用指向Class对象时就会被卸载,结束类的生命周期

类什么时候才被初始化:

1)创建类的实例,也就是new一个对象

2)访问某个类或接口的静态变量,或者对该静态变量赋值

3)调用类的静态方法

4)反射(Class.forName("com.lyj.load"))

5)初始化一个类的子类(会首先初始化子类的父类)

6)JVM启动时标明的启动类,即文件名和类名相同的那个类

只有这6中情况才会导致类的类的初始化。

类的初始化步骤:

1)如果这个类还没有被加载和链接,那先进行加载和链接

2)假如这个类存在直接父类,并且这个类还没有被初始化(注意:在一个类加载器中,类只能初始化一次),那就初始化直接的父类(不适用于接口)

3 ) 假如类中存在初始化语句(如static变量和static块),那就依次执行这些初始化语句。

在java中有三种类 类加载器。

1)Bootstrap ClassLoader此加载器采用c++编写,一般开发中很少见。

2)Extension ClassLoader用来进行扩展类的加载,一般对应的是jre\lib\ext目录中的类

3)AppClassLoader加载classpath指定的类,是最常用的加载器。同时也是java中默认的加载器。

自定义类加载器

4)Custom ClassLoader

     属于应用程序根据自身需要自定义的ClassLoader,如tomcat、jboss都会根据j2ee规范自行实现ClassLoader

推荐阅读更多精彩内容