谈谈对final的理解
1、final修饰类
类不能被继承,类中的所有方法都是final的
2、final修饰方法
方法不能被覆盖,private修饰的方法隐性的添加了final
3、final修饰方法内参数
方法内的参数不会被改变,但如果是类或者引用其值可以被改变
public static void main(String[] args){ StringFinal stringFinal = new StringFinal(); StringBuffer buffer = new StringBuffer("hello"); StringFinal.changeValue(buffer); System.out.println(buffer); } public static void changeValue(final StringBuffer buffer){ //final修饰引用类型的参数,不能再让其指向其他对象,但是对其所指向的内容是可以更改的。 //buffer = new StringBuffer("hi"); //error buffer.append("world"); }
输出“helloworld”
4、final修饰变量
final修饰变量,变量一旦被赋值,就不可被改变。如果变量被赋值为简单数值时,是可以被编译器当成常量调用。
public static void main(String[] args) { String a = "hello2"; final String b = "hello"; String d = "hello"; String c = b + 2; String e = d + 2; System.out.println((a == c));//true System.out.println((a == e));//false String e = d + 2 相当于 String e = new String(d + 2)
}
如果变量被方法赋值时,也就是说被其他引用赋值时,所以,只能运行时被赋值
public class Test { public static void main(String[] args) { String a = "hello2"; final String b = getHello(); String c = b + 2; System.out.println((a == c)); //false 此时的 String c = b + 2;相当于 String c = new String(b + 2)
} public static String getHello() { return "hello"; } }
总结,在Java里,本质是值传递,所以被final修饰后基本数据变量的值是不变的,final类所指向的引用时不会变的。
参考:https://www.cnblogs.com/xiaoxi/p/6392154.html;