谈谈final

网友投稿 642 2022-11-26

谈谈final

谈谈final

用final修饰类

这种情况很简单,这个类不能被继承。它"绝后"了。

用final修饰方法

这里可以分两种情况。

用final修饰private方法。其实也不能这么说,因为私有方法也被编译器隐式修饰为final,这意味着private final void f()和private void f()并无区别。

用final修饰public方法。 那么此方法不能被重写。

用final修饰参数

举个例子

public void f2(final int a ,final User u) { a=15; //error u.setPassWord("sdf"); //correct u=new User(); //error System.out.println("类b中的f2被调用了"); }

用final修饰成员变量

我们看代码

import java.util.ArrayList;import java.util.List;public class ListWrapper { private final List list; private final int a=15; public ListWrapper(){ list = new ArrayList();// a=10; } public boolean contains(E e){ return list.contains(e); } public void add(E e){ list.add(e); } public void remove(E e){ list.remove(e); } public static void main(String[] args){ ListWrapper list=new ListWrapper(); Person a=new Person(); Person b=new Person(); list.add(a); System.out.println(list.contains(a)); list.remove(a); }}

成员变量是随类初始化或对象初始化而初始化的,当执行静态初始化块时候可以对类属性进行赋初始值,当执行普通初始化块或者构造器的时候可以对实例属性赋初始值。因此成员变量的初始值可以在定义的时候赋值或者在初始化块、构造器中指定。

因此对于list与a的赋值,我们可以在构造函数里赋值,也可以在定义的时候赋值,也可以在静态代码块里赋值。不过如果是在静态代码块里赋值,那么成员变量也应该是静态的。

除了在上述三个地方对final变量赋值外,在其他地方都是非法的。

另外用final修饰list,或者说修饰引用类型变量,final只保证变量引用的地址不变,但可以改变堆内存的具体信息。

例如,我可以使用ListWrapper的add和remove方法。此时我改变的是list在堆内存的数据信息,但是list在堆内存的位置并没有改变。

/

以下为2019-9-13日更新

如果是这么一种情况

class Person{ private int score=0; final private int money; public Person(int m){ money=m; } public int getScore() { return score; } public void setScore(int score) { this.score = score; } public int getMoney() { return money; } }

那么

Person person=new Person(4); person=new Person(5); System.out.println(person.getMoney());

上面的代码OK么?

答案是OK的,最开始的4那个p指向的person已经被垃圾回收了以上为2019-9-13日更新

/

再看一个例子

String a="abc";a="edf";

String的源码:

public final class String implements java.io.Serializable, Comparable, CharSequence { /** The value is used for character storage. */ private final char value[];.......}

String型的a可变,String是被final修饰的 这个不矛盾么?

用final修饰String 表示String不可被继承

用final修饰value表示String中的这个变量不可重新赋值

我们看下面的例图就OK了

a="def";

并不是复写了abc,而是让变量a指向另一块内存,至于原来的"abc"就等着gc来回收。

参考资料

​​http://blog.sina.com-/s/blog_6275b95d0100xdfd.html​​

​​http://blog.163.com/maomaoyu_1012/blog/static/19060130520116269329894/​​

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Struts的取值与标签
下一篇:struts ajax多级下拉菜单
相关文章

 发表评论

暂时没有评论,来抢沙发吧~