泛型 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)
动态代理 动态代理是设计模式当中代理模式的一种
代理模式的作用是:为其他对象提供一种代理以控制对这个对象的访问。
代理模式有什么好处?
在某些情况下,一个客户不想或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。
动态代理的作用
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