在Java中,final关键字可以用来修饰类、方法和变量(包括成员变量和局部变量)。
1、修饰类
当用final修饰一个类,表明这个类不能被继承。也就是说如果一个类永远不让被继承,那么他可以用final修饰,String类就是final类。
final类的成员变量可以根据需要设为final,但是要注意final类的所有成员方法都会隐式第指定为final方法。
2、修饰方法
final修饰方法,一、可以把方法锁定,以防任何继承类修改它的含义。即:该方法在子类中明确禁止被覆盖。二、早期的java实现版本中,会将final方法转为内嵌调用,尅呀提高效率。在最近的java版本中,不需要使用final方法进行这些优化了。
注:类的private方法会隐式地被指定为final方法。
3、修饰变量
一、对于一个final变量,如果是基本数据类型的变量,则其数据一旦在初始化之后边不能更改。如果是一个引用类型的变量,则在其初始化之后不能再指向其他对象。
深刻理解final关键字。
1.类的final变量和普通变量有什么区别?
当用final作用于类的成员变量时,成员变量(注意是类的成员变量,局部变量只需要保证在使用之前被初始化赋值即可)必须在定义时或者构造器中进行初始化赋值,而且final变量一旦被初始化赋值之后,就不能再被赋值了。
2.被final修饰的引用变量指向的对象内容可变吗?
在上面提到被final修饰的引用变量一旦初始化赋值之后就不能再指向其他的对象,那么该引用变量指向的对象的内容可变吗?看下面这个例子:
public class Test {public static void main(String[] args) {
final MyClass myClass = new MyClass();
System.out.println(++myClass.i);
}
}
class MyClass {
public int i = 0;
}
这段代码可以顺利编译通过并且有输出结果,输出结果为1。这说明引用变量被final修饰之后,虽然不能再指向其他对象,但是它指向的对象的内容是可变的。
3.final和static
很多时候会容易把static和final关键字混淆,static作用于成员变量用来表示只保存一份副本,而final的作用是用来保证变量不可变。看下面这个例子:
public class Test { public static void main(String[] args) { MyClass myClass1 = new MyClass(); MyClass myClass2 = new MyClass(); System.out.println(myClass1.i); System.out.println(myClass1.j); System.out.println(myClass2.i); System.out.println(myClass2.j); } } class MyClass { public final double i = Math.random(); public static double j = Math.random(); } |
运行这段代码就会发现,每次打印的两个j值都是一样的,而i的值却是不同的。从这里就可以知道final和static变量的区别了。