您的位置:首页 >关注 > 正文

JAVA关键字:final 每日报道

final

final可以用在类、方法、变量上。 1、final用在类上,表明当前类它不能被继承,没有子类。


【资料图】

public final class 类名称 { // ... }

注意:一个类如果是final的,那么其中所有的成员方法都无法进行覆盖重写

2、final用在方法上,表明当前方法不能被override,不能被重写。

修饰符 final 返回值类型 方法名称(参数列表) {

// 方法体}

注意:对于类、方法来说,abstract关键字和final关键字不能同时使用,因为矛盾。有抽象方法的abstract类被继承时,其中的方法必须被子类Override,而final不能被Override。

3、final用在变量上,表明当前变量是一个终态的变量,是一个常量,这个变量的值一但被赋值后就不能被改变了。对于final类型的成员变量的初始化方式: 1、声明变量时直接赋值

final int X=1;

对于基本类型来说,不可变说的是变量当中的数据不可改变

对于引用类型来说,不可变说的是变量当中的地址值不可改变

2、在构造方法中完成赋值,如果一个类有多个构造方法,就要保证在每个构造方法中都要完成对该final类型变量的初始化工作。

例:

public class FinalOriginalTest {

private final int a;

private String name;

public FinalOriginalTest(){  

a = 3;

}

public FinalOriginalTest(String name){  

this.name = name;

}

public static void main(String[] args){  

FinalOriginalTest ft = new FinalOriginalTest();  

FinalOriginalTest ft1 = new FinalOriginalTest("hello");

}}

问题:上面的程序能否编译通过? 解答:不能编译通过,可能没有初始化变量a。因为对于final类型的成员变量的初始化,在构造方法中完成赋值,如果一个类有多个构造方法,就要保证在每个构造方法中都要完成对该final类型变量的初始化工作。所以需要在public FinalOriginalTest(String name)构造方法中给a赋值。

问题:上面的程序中,修正问题1之后,将private final int a;改为private static final int a;能否编译通过? 解答:不能编译通过,因为a是静态变量,在这个类还没有实例化的时候,它的值就已经有了。所以对于一个int类型的static final类型的变量a来说,我们只能在声明的时候就给它赋值private static final int a = 3;然后把构造方法里面的赋值给注释掉,这样编译就能通过了。 总结:对于final类型的变量,对于不加static我们可以有两种方式给它赋值:声明变量时直接赋值;在构造方法中完成赋值,如果一个类有多个构造方法,就要保证在每个构造方法中都要完成对该final类型变量的初始化工作。对于一个变量既是final又是static的,我们必须在声明变量时直接赋值。

关键词

热门资讯