Java中的final关键字

一.Java中的final可以用到数据、方法、类中

1.fianl修饰的数据:常量

当在一个变量定义前面使用final关键字,那么这个变量就必须在定义时初始化,如下:

private final static int static_num1=10;//final常量必须在创建是完成初始化

 常量在创建的时候就必须完成初始化

当final 和static联合使用时,需要注意一个初始化问题,如下:

在这里使用一个非静态的变量ran来初始化一个静态常量 static_num2,发生了报错,并不是非静态变量不能初始化静态变量,而是在类变量的定义中静态变量优先于非静态变量的初始化,所以在创建static_num2的时候ran变量还没有创建,发生报错。

在函数中充当形参,注意点:

public int add(final int num) {
        return num+1;//num+1能够返回   但是num++ 和++num不能够返回 ,因为num不是一个可改值,采用前缀自增或者后缀自增将改变其本身的值,但是采用+1只是将其作为一个常量
    }

2.final修饰的对象引用

 注意:fianl修饰对象,并不是对象不能更改,而是被修饰的引用不可以在指向其他对象,而对象本身是可以修改的。

例子如下:

那么在向一个函数传递实参时,这个final修饰的对象就很重要了,他可以保证你的引用实参不会在函数里被修改。看下面的例子:

public static void f(final A a) {
        System.out.println("调用了fianl类型的参数");
        a = new A();//错误
    }

我们在调用这个函数f时传入的参数A类的引用不需要是fianl类型的。

 3.final修饰的方法:

final修饰的方法通常就是使得一个方法不能够被继承时被子类进行重写,那么使用关键字private也是同样的效果,他将使得子类无法获得父类该方法。

例子:

父类:

子类:

对于使用final修饰的了f1(),编译器直接报出无法重写的错误。而对于使用private修饰的f2()方法,编译器则直接报出去除重写标签(@override)的提示,那么这也就是说当去除标签后,相当于在子类里重新建立了一个新的方法f2(),这个方法与父类是没有任何一点关系的。

4.final修饰的类

使用fianl来修饰类,那么这个类将会是无法继承的,同样的如果这个类无法被继承,那么就不存在方法重写,所以对于一个final类他的方法从某种角度将就是默认为final的

例子:

 

原文地址:https://www.cnblogs.com/SAM-CJM/p/9365345.html