should

1
finalize方法名。Java 技术允许使用 finalize() 方法在垃圾收集器将对象从内存中清除出去之前做必要的清理工作。这个方法是由垃圾收集器在确定这个对象没有被引用时对这个对象调用的。它是在 Object 类中定义的,因此所有的类都继承了它。子类覆盖 finalize() 方法以整理系统资源或者执行其他清理工作。finalize() 方法是在垃圾收集器删除对象之前对这个对象调用的。

2
说说自定义注解的场景及实现
(此题自由发挥,就看你对注解的理解了!==)登陆、权限拦截、日志处理,以及各种Java框架,如Spring,Hibernate,JUnit 提到注解就不能不说反射,Java自定义注解是通过运行时靠反射获取注解。实际开发中,例如我们要获取某个方法的调用日志,可以通过AOP(动态代理机制)给方法添加切面,通过反射来获取方法包含的注解,如果包含日志注解,就进行日志记录。

3
泛型中的?通配符
问题:定义一个方法,该方法用于打印出任意参数化类型的集合中的所有数据,该方法如何定义呢?
错误方式:

public static void printCollection(Collection cols) {
for(Object obj:cols) {
System.out.println(obj);
}
// cols.add("string"); // 没错
// cols = new HashSet(); // 会报告错误!
}
Collection中的Object只是说明Collection实例对象中的方法接受的参数是Object。Collection是一种具体类型,new HashSet也是一种具体类型,两者没有兼容性问题。

正确方式:

public static void printCollection(Collection collection) {
for(Object obj : collection) {
System.out.println(obj);
}
// collection.add(1); // 错误,因为它不知自己未来匹配就一定是Integer
System.out.println(collection.size()); // 没错,此方法与类型参数没有关系
collection = new HashSet(); // 可以
}
Collection a可以与任意参数化的类型匹配,但到底匹配的是什么类型,只有以后才知道,所以,a = new ArrayList和a = new ArrayList都可以, 但a.add(new Date())或a.add("abc")都不行。

总结:
使用?通配符可以引用其他各种参数化的类型,?通配符定义的变量主要用作引用,可以调用与参数化无关的方法,不能调用与参数化有关的方法。

4
泛型中的?通配符的扩展
限定通配符的上边界:

正确:

Vector x = new Vector();
错误:

Vector x = new Vector();
限定通配符的下边界:

正确:

Vector x = new Vector();
错误:

Vector x = new Vector();
注意:

限定通配符总是包括自己。
?只能用作引用,不能用它去给其他变量赋值。

Class x = Class.forName("java.lang.String");
编译报错,因为方法forName为

public static Class forName(String className) throws ClassNotFoundException { }
可知此方法的返回结果是Class,所以不能用它去给其他变量赋值。
上面代码相当于:

Class y;
Class x = null;
y = x; // 编译通过
x = y; // 编译错误
再看一个例子:

Vector y = new Vector();
Vector x = y;
上面的代码错误,原理与Vector x11 = new Vector();相似,只能通过强制类型转换方式来赋值。\

你可能感兴趣的:(should)