Java基础增加四
了解和入门注解的应用:
注解是JDK1.5的新特性。
基本注解:
@SuppressWarnings
这是用于压缩警告信息
@Deprecated
这是用于说明这个方法已经过时了,提醒后用者最好别用。
@Override
这是大家都常见的,特别用IDE工具的时候。标记这个方法是重写父类的方法。
示例:
// 注解 publicclass AnnotationTest {
//一个注解就是一个类,用就相当于创建了它的实例对象 //压缩警告 @SuppressWarnings("deprecation") publicstaticvoid main(String[] args) {
System. }
//指定这个方法过时 @Deprecated publicstaticvoid System.out.println("h1,java"); }
@Override public String toString() { return"Annotation"; }
} |
总结:
注解相当于一种标记,在程序中加了注解就等于为程序打上了某种标记,没加,则等于没有某种标记,以后,javac编译器,开发工具和其他程序可以用反射来了解你的类及各种元素上有无何种标记,看你有什么标记,就去干相应的事,标记可以加在包,类,字段,方法,方法的参数以及局部变量上。
看java.lang包,可看到JDK中提供的最基本的annotation.
体验泛型
一样是JDK1.5的特性。
示例代码:
// 泛型 publicclass GenericTest {
publicstaticvoid main(String[] args) { //指定存储的数据类型 ArrayList<String> collection2 =new ArrayList<String>(); collection2.add("abc"); //可以直接知道返回的类型,不用进行强制类型转换 String element = collection2.get(0); System.out.println(element); } } |
没有使用泛型时,只要是对象,不管什么类型的对象,都可以存储进同一个集合中。使用泛型集合,可以将一个集合中的元素限定为一个特定类型,集合中只能存储同一个类型的对象,这样更安全,并且当从集合获取一个对象时,编译器也可以知道这个对象的类型,不需要对对象进行强制类型转换,这样更方便。
泛型内部原理
泛型是给编译器看的:
// 泛型 publicclass GenericTest {
publicstaticvoid main(String[] args)throws Exception {
//泛型是给编译器看的 ArrayList<Integer> collection3 =newArrayList<Integer>(); //用反射穿透泛型,传入字符串进去 collection3.getClass().getMethod("add", Object.class).invoke(collection3,"def"); System.out.println(collection3.get(0)); } } |
结果输出def。
泛型的通配符
限定通配符的上边界:
正确:Vector<? extends Number> x = new Vector<Integer>();
错误:Vector<? extends Number> x = new Vector<String>();
限定通配符的下边界:
正确:Vector<? super Integer> x = new Vector<Number>();
错误:Vector<? super Integer> x = new Vector<Byte>();
提示:
限定通配符总是包括自己。
泛型集合的综合案例
能写出下面的代码即代表掌握了Java的泛型集合类:
HashMap<String,Integer> hm = new HashMap<String,Integer>();
hm.put(“fiend”,23);
hm.put(“funfang”,22);
Set<Map.Entry<String,Integer>> mess = hm.entrySet();
for (Map.Entry<String,Integer> me : mess) {
System.out.println(me.getKey() + “:” + me.getValue());
}
类加载器:
Java虚拟机中可以安装多个类加载器,系统默认三个主要类加载器,每个类负责加载特定位置的类:BootStrap,ExtClassLoader,AppClassLoader
类加载器也是Java类,因为其他是java类的类加载器本身也要被类加载器加载,显然必须有第一个类加载器不是java类,这正是BootStrap.
Java虚拟机中的所有类装载器采用具有父子关系的树形结构进行组织,在实例化每个类装载器对象时,需要为其指定一个父级类装载器对象或者默认采用系统类装载器为其父级类加载。
当Java虚拟机要加载一个类时,到底派出哪个类加载器去加载呢?
首先当前线程的类加载器去加载线程中的第一个类。
如果类A引用了类B,Java虚拟机将使用加载类A的类装载器来加载类B。
还可以直接调用ClassLoader.loadClass()方法来指定某个类加载器去加载某个类。
每个类加载器加载类时,又先委托给其上级类加载器。
当所以有的祖宗类加载器没有加载到类,回到发起者类加载器,还加载不了,则抛ClassNotFoundException,不是再去找发起者类加载器的儿子,因为没有getChild方法,即使有,那有多个儿子,找哪一个呢?
代理的概念与作用
生活中的代理
武汉人从武汉的代理商手中买联想电脑和直接跑到北京传智播客旁边来找联想总部买电脑,你觉得最终的主体业务目标有什么区别吗?基本上一样吧,都解决了核心问题,但是,一点区别都没有吗?从代理商那里买真的一点好处都没有吗?
至少成本要少点。
程序中的代理
要为已存在的多个具有相同接口的目标类的各个方法增加一些系统功能,例如,异常处理、日志、计算方法的运行时间、事务管理、等等,你准备如何做?
如在代理类中调用被代理类前后加上时间计算即可。
------------完------------------------