app开发者平台在数字化时代的重要性与发展趋势解析
642
2022-11-26
谈谈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
成员变量是随类初始化或对象初始化而初始化的,当执行静态初始化块时候可以对类属性进行赋初始值,当执行普通初始化块或者构造器的时候可以对实例属性赋初始值。因此成员变量的初始值可以在定义的时候赋值或者在初始化块、构造器中指定。
因此对于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
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小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~