垃圾回收
finalize的用法 (从object类中继承得到)
垃圾回收器回收对象的时候先调用这个类的finalize方法。此方法在object中实现。当使用其他语言许释放内存时可在此方法中写语句进行内存回收。java可自动回收内存。为了减小资源的消耗java回收机制当垃圾达到一定程度时才会自动调用垃圾回收机制释放内存。
finalize 必须是一个无返回值类型protected修饰符修饰的方法 即必须为 protected void finalize(){}
System.gc(); 的作用是启动垃圾回收机制
public class Test {
public static void main(String[] args) {
ClassA a = new ClassA("A");
new ClassA("B");
Test t = new Test();
t.method();
System.gc();
}
void method(){
ClassA c = new ClassA("C");
}
}
class ClassA{
private String name;
ClassA(String name){
this.name = name;
}
@Override
protected void finalize(){
System.out.println( this.name+"类将被垃圾回收机制处理");
}
}
为什么只有B对象和C对象被回收了呢 A的对象不也没用了么 为什么没有回收?
B对象没有引用 所以被垃圾回收机制回收 C对象在t.method()方法执行完后C对象生命周期结束,C对象没有引用能都指向它所以被垃圾回收机制处理
A对象的生命周期为整个main方法 当main方法执行完后A的引用才失去作用 ,所以在使用垃圾回收机制处理时A对象的引用还存在,不会被处理。
垃圾回收器如何工作 参考
我从这个文章中截取了一段图片放这里看全部文章点击参考
枚举类型 默认继承 java.lang.Enum 根据java单继承机制 枚举类不能继承其他类 但是能实现其他接口
这篇文章可做参考 重点看原理分析
创建一个简单的枚举类型
//把 class 替换成 enum 关键字
public enum SimpleEnum {
// 枚举值
BIG,MEDIUM,SMALL;
}
使用枚举
public class Main {
public static void main(String[] args) {
SimpleEnum a = SimpleEnum.SMALL;
System.out.println(a); ------+
System.out.println(SimpleEnum.SMALL); --+ 两个其实是一样的
System.out.println(SimpleEnum.SMALL.ordinal()); //枚举实例的位置 也就是0开始第几个
}
}
结果 可以看出一个枚举值就相当于这个枚举的对象
给枚举绑定信息( 使用枚举把逻辑代码里面不应该出现常量字符串和常量数字之类的东西替换成定义的常量)
这里就需要给枚举实例绑定对应的信息
public enum SimpleEnum {
/**
* 大的
*/
// 把code 在初始化时 传给构造方法
BIG(100),
/**
* 中等的
*/
MEDIUM(50),
/**
* 小的
*/
SMALL(1);
// 枚举实例绑定的code
private Integer code;
// 枚举的构造方法可使 初始化时对常量进行绑定
SimpleEnum(Integer code){
this.code = code;
}
// 添加get构造方法 可获取枚举实例对应的code
public Integer getCode() {
return code;
}
}
用法
public class Main {
public static void main(String[] args) {
Integer a = SimpleEnum.SMALL.getCode();
System.out.println(a);
System.out.println(SimpleEnum.SMALL.getCode());
System.out.println(SimpleEnum.MEDIUM.getCode());
System.out.println(SimpleEnum.BIG.getCode());
}
}
结果 可以看到可直接使用枚举类.枚举实例.getCode() 获取对应的code
如何让一个code对应 一个message呢
public enum SimpleEnum {
/**
* 大的
*/
BIG(100,"大"),
/**
* 中等的
*/
MEDIUM(50,"中等"),
/**
* 小的
*/
SMALL(1,"小");
private Integer code;
private String message;
SimpleEnum(Integer code,String message){
this.code = code;
this.message = message;
}
public Integer getCode() {
return code;
}
public String getMessage() {
return message;
}
}
使用
public class Main {
public static void main(String[] args) {
Integer code = SimpleEnum.SMALL.getCode();
String message = SimpleEnum.SMALL.getMessage();
System.out.println(code +":"+message);
System.out.println(SimpleEnum.SMALL.getCode()+":"+SimpleEnum.SMALL.getMessage());
System.out.println(SimpleEnum.MEDIUM.getCode()+":"+SimpleEnum.MEDIUM.getMessage());
System.out.println(SimpleEnum.BIG.getCode()+":"+SimpleEnum.BIG.getMessage());
}
}
结果
如何 通过id获取message呢 又如何通过code获取对应的枚举实例呢
public enum SimpleEnum {
/**
* 大的
*/
BIG(100, "大"),
/**
* 中等的
*/
MEDIUM(50, "中等"),
/**
* 小的
*/
SMALL(1, "小");
private Integer code;
private String message;
SimpleEnum(Integer code, String message) {
this.code = code;
this.message = message;
}
public Integer getCode() {
return code;
}
public String getMessage() {
return message;
}
/**
* 通过code获取对应的枚举实例
*
* @param code code
* @return 枚举实例
*/
public static SimpleEnum getEnumByCode(Integer code) {
for (SimpleEnum simpleEnum : SimpleEnum.values()) {
if (code != null && code.equals(simpleEnum.code)) {
return simpleEnum;
}
}
return null;
}
/**
* 通过code 获取对应的 message
*
* @param code code
* @return message
*/
public static String getMessageByCode(Integer code) {
return getEnumByCode(code) != null ? getEnumByCode(code).message : null;
}
}
使用
public class Main {
public static void main(String[] args) {
//获取code对应的枚举实例
System.out.println(SimpleEnum.getEnumByCode(100));
//获取code对应的message信息
System.out.println(SimpleEnum.getMessageByCode(100));
}
}
结果
枚举类型可以当成一个class 不过这个class 比较特殊
枚举可以跟类一样可以写在单独创建 入上面 一个枚举一个类文件 也可以跟类写在一个类文件中(如下面的Enum1) 可以写在类内(入下面的Enum2)
枚举用于switch
public class Main {
public static void main(String[] args) {
Enum1 big = Enum1.BIG;
switch (big) {
case BIG:
System.out.println("大的");
break;
case SMALL:
System.out.println("小的");
break;
case MEDIUM:
System.out.println("中等的");
break;
default:
System.out.println("没找到");
}
}
}
enum Enum1 {
/**
* 大的
*/
BIG,
/**
* 中等的
*/
MEDIUM,
/**
* 小的
*/
SMALL
}
结果
访问权限控制
包的权限 同一个包下不需要导入
如图 SimpleEnum类在mypackage包下 那么在Main类中就无法访问 如果想访问需要在类名前加上具体报名
或者 使用import
权限修饰符
类访问权限