java中final关键字
package frank; public class App { public static void main(String[] args) { Person p = new Person(); final String s1 = "1";//使用final 把它变成宏变量,仅限直接量。 //s1 = "1"; 这样子赋值后就不会是宏变量 final String s2 = "2";//使用final 把它变成宏变量,仅限直接量。 String s3 = "12"; String s4 = s1 + s2;//执行宏替换,如果不用final修饰,那么就不会执行宏替换。 System.out.println(s3 == s4);//输出true,如果不用final变量修饰,那么就不会再编译期间确定值了,最终结果就会使false,所以不会跟s3指向常量池中同一个对象。 } } class Person { public final int age;//只能在普通代码块和构造方法中赋值或者直接量,且只能有一个地方对其赋值。 public final static int weight;//只能在静态代码块赋值,或者直接量。只能赋值一次。 { age = 20; } static { weight = 20; } public Person() { //age = 20; 报错 } public void test(final String str) { //str = "1"; //报错,不能对final修饰的形参重新赋值。 final String s2; s2 = "2"; //s2 = "3"; //不能对final修饰的局部变量进行第二次赋值。 } }
如果是final修饰的成员,系统不会给默认值,就算系统给了默认值也是一个没有意义的值。所以在没赋值之前去访问的话就会抛异常。如果在编译期间就能确定的值就是“宏变量”,只能是直接量,例如:final int a = 10;System.out.println(a);相当于System.out.println(10);系统会把实际值传递给方法。
final修饰方法:一个方法被final修饰后那这个方法就不能被重写,但是可以重载。如果类用final修饰的话表示该类不能被继承。比如:java.lang.Math包下面的类就不能被继承。