美文网首页java基础与进阶web攻城狮Java学习笔记
泛型 枚举 反射 动态代理 类加载 类的生命周期--复习笔记

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

作者: Kevin_Curry | 来源:发表于2016-03-16 11:04 被阅读378次

    泛型  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

    相关文章

      网友评论

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

        本文链接:https://www.haomeiwen.com/subject/ejankttx.html