一、 Java并没有虚构函数,但是有finalize()方法,它被声明为protected,finalize()会在对象被回收是执行,但不可以将它当做析构函数用,因为不知道对戏那个资源合适被回收,所以也不知道finalize()真正被执行的时间,也就无法立即执行所指定的资源回收动作。
如果确定不再使用某个对象,可以在参考至该对象的名称上指定null,表示这个名称不再参考至任何对象,不被任何名称参考的对象将会被回收资源,可以使用System.gc()建议程序进行垃圾手机,如果建议被采纳,则对象资源会被回收,回收前执行finalize()方法。
下面是测试的源代码:
package com.hewen;
public class GcTest {
private String name;
public GcTest(String name){
this.name=name;
System.out.println(name+"建立");
}
//对象回收前执行
protected void finalize(){
System.out.println(name+"被回收");
}
}
package com.hewen;
public class UseGc {
public static void main(String[] args){
GcTest ob1=new GcTest("obj1");
GcTest ob2=new GcTest("obj2");
GcTest ob3=new GcTest("obj3");
ob1=null;
ob2=null;
ob3=null;
//建议回收对象
System.gc();
}
}
二、Object clone方法,他是浅复制不是甚复制该类要进行复制对象必须实现Cloneable接口,在用super.clone()调用
三、内嵌类:
四、定义泛型类,如果有多个不确定的类型,只需在定义类的时候写上XXClass<T1,T2,...,Tn>,
下面是测试的源代码:
package com.hewen;
public class GenericFoo<T> {
private T foo;
public void setFoo(T foo) {
this.foo = foo;
}
public T getFoo() {
return foo;
}
}
package com.hewen;
public class TestGeneric {
public static void main(String[] args){
GenericFoo<Boolean> foo1=new GenericFoo<Boolean>();
GenericFoo<Integer> foo2=new GenericFoo<Integer>();
//这样在定义对象的时候就确定了泛型类类型持有者T真正的类型,但是用Object
//类型需要装换,这样可以避免程序员在转型的时候类型写错,会出现ClassCastException
}
}
4.1 泛型还可以限制可用的类型
可以在定义类型持有者时,同时使用extends指定这个类型持有者实例化,
实例化的对象必须是扩充自某个类型或者实现的某个接口,如:
定义类ListGenericFoo<T extends List>,这样实例化 这个类时必须是实现java.util.List接口的类
此时还可以要求更加严格一点如:ListGenericFoo<T extends List<String>>
4.2 使用通配符?
比如一个方法需要注入的方法是一个类型,但是这个类型是变化的如:
public void showFoo(GenericFoo<? extends String> foo)
这就是针对String或其子类而定制的内容,
如果不适用extends,则默认是允许Object及其下的子类
使用通配符声明对象与没有适用通配符的区别?
通过使用通配符声明的名称所参考的对象,您没有办法在对它的添加新的信息,您只能去的他当众的信息或是移出当中的信息
4.3 泛型的继承与接口的实现规则
如:GenericFood<T1,T2>父类,子类必须是SubGenericFood<T1,T2,T3> extends GenericFood<T1,T2>
interface IFoo<T1,T2>
ConcreteFoo<T1,T2> implements IFoo<T1,T2>