java的final关键字

时间:2022-08-16 15:27:26

在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变量的区别了。