final...?

来源:互联网 发布:股票网络销售违法嘛 编辑:程序博客网 时间:2024/06/09 23:42

final?finally?finalize?

几个同胞兄弟的作用却是迥异

按照一般的学习顺序的话

final:用来标识一个段子绝孙的家伙

1. 标记对象:标记的东西可以是类,对象,反正是可以调用的东西

2. 标记作用:被标记也就被阉割了,断子绝孙;类不再可以被继承,变量不再可以换内容

3. 标记用途:

    1. 个体独立:想要一些不想被修改的东西?保持自己的个性?那就是它了,好比Math.PI,好比String,你会发现他们都是末代 

    2.情景需要:在一些特殊的情景下,为了保证功能,那必须都是不会变化的。代理?或者是默写线程中


finally:异常处理的最后手段

1. 处理范围:捕捉异常try...catch...finally指定的最后操作,这家伙是处理范围指定的最后一步,同时也是三个家伙权力最大的大佬

2. 标记作用:异常处理的指定后续操作,无论如何,必定是最后执行;因为权力最大,可以自定义一些骚操作,虽然没实际卵用

3. 标记用途:文件流,socket之类的最后不得关闭啊,这类异常关闭操作一般都放在这

4. 执行顺序:

    1. 一般执行顺序:就如字面上的意思,先try再catch后finally

    2. 特殊执行顺序:如果catch和finally都定义了return,哪怕return含有操作,大佬finally也会截断catch小弟

public int test(){int i = 0;try {throw new Exception();} catch (Exception e) {return ++i;}finally{return ++i;}}


finalize:死亡前的最后一口气

说到这玩意,我觉得应该先插入点东西(都是自己意淫出来的,不是啥正规玩意)

对象的组成:

1. 引用:就是名称,变量名啥的,它可以让你代指一个实体;不过薄情寡义,只要类型一致,随时换丈夫

2. 实体:就是对象啦,我们用类定义了一个模板,对象就是他的数据填充;类是人类的话,那对象实体就是你我他

3. 指针:就是物理存储空间,实体就住在这里面,这个空间只能通过地址找到,就是指针了

对象的赋值方式:

1. 引用替换:用引用放在左边进行赋值的话,指向的实体就会发生变化,不过原来的实体还在原来的位置,算是改嫁了,老公变了,原配还在

2. 空间替换:这就是指针的空间替换了,经过这种操作,空间不变,但是存储的数据结构是新的东西了

public static void main(String args[]){String name = "godme";String arr[] = {"godme"};test(name, arr);System.out.println("name:\t" + name);//godmeSystem.out.println("arr[0]:\t" + arr[0]);//judas}public static void test(String string, String arr[]){string = "judas";arr[0] = "judas";}

可以看到,通过名称引用,原来空间内的内容并没有变化,但是直接用替换空间内容,是再找不到东西的

一般的数组,列表都是空间引用,哪怕把他放在某个地方了,自己也是会变化的

public static void main(String args[]){List<List<String>>list = new ArrayList<List<String>>();List<String>list2 = new ArrayList<String>();list2.add("godme");list.add(list2);list2.add("judas");}

地址引用只是记录了一个地址列表,只负责根据地址找实体,至于原来地址发生了什么,它都是不会管的

不管经过了几级,最后的地址空间都是那一个


对象的操作:

1. 替换:不管名称引用或者地址引用,改变的不是换了个新的指向对象,就是更换了空间内的对象,都属于一个替换操作,并没有对实体对象进行改动加工

2. 操作:通过调用对象本身,对自身set或其他方法改变自身内容,这才叫操作,不论何种方式,能对对象操作的只有对象本身进行的自操作,只是获取实体方式的不一


言归正传

finalize干嘛用的

想象一下,如果创建一个实体赋给一个引用,然后用另一个实体替换他,结果?

出现了一个没有名称引用,也没有地址引用的家伙

存在?是的,但是无法得到它。

有作用嘛?有的,占内存

如果内存都被这种无用的家伙占了,我们还能做什么


所以JVM提供了一个辣鸡回收

Runtime.getRuntime().gc();

不过一般是真的没内存了或者什么时候JVM才会自动启动它,上面的方法就是手动调用垃圾回收

处理的优先对象就是上面这种逍遥法外,不受约束的家伙了


而finalize定义的就是处理它的时候会调用的方法

public static void main(String args[]){Client client = new Client();client = null;Runtime.getRuntime().gc();}public void finalize(){System.out.println("over");}
这就被处理掉了

这个方法一般情况下估计是不会被玩到的


总结一下

final:不可变化,断子绝孙

finally:排在最后,权力最大,扮猪吃虎

finalize:最后一句遗言


类别划分的话:

final:变量,的修饰

finally:代码块

finalize:方法