浅谈Java中的final关键字

浅谈Java中的final关键字

一、final修饰变量

1、final常用方法

final修饰变量表明该变量是不可变的,类似于如下的效果

public class FinalTest {
    public static void main(String[] args) {
        final int a = 10;
        a = 20;		// 这行会报错,提示Cannot assign a value to final variable 'a'
    }
}

在实际中,经常搭配static一起使用

public class FinalTest {
    public static final double PI = 3.14;
}

静态变量不需要对象就可以使用,而且可以被全局调用,当再加上final后,它就变成了一个全局的常量。可以看成C++中的const关键字,之后就可以再任何地方调用FinalTest.PI使用3.14这个值。

2、final修饰成员变量和局部变量

成员变量a在声明时,未赋值的话会报错,会告诉你未初始化。但局部变量b、c、d、e、f却没有报错,所以我们可以得出结论:

  • final修饰成员变量时必须赋值,而局部变量可以暂且不赋值。
public class FinalTest {

    public final double PI = 3.14;
    public final int a;		// 只有这一行报错,Variable 'a' might not have been initialized
    public static void main(String[] args) {
        final int b;
    }
    public void test1() {
        final int c;
    }
    public static void test2() {
        final int d;
    }
    {
        final int e;
    }
    static {
        final int f;
    }
}
  • final修饰局部变量如果没有初始化则不能直接使用。
public class FinalTest {
    
    public final double PI = 3.14;
    public static void main(String[] args) {
        final int a;
        System.out.println(a);	// 报错,Variable 'a' might not have been initialized
    }
}
  • final修饰的局部变量不能进行二次赋值
public class FinalTest {
    public static void main(String[] args) {
        final int a;
        a = 10;
        a = 20;	// 报错,Variable 'a' might already have been assigned to
    }
}

3、final和string修饰变量的不可变性

final的不可变性是变量的指向不可变,指向的内容可以变。而String则相反,是指向可以变,但是指向的内容不可变(字符串常量池)。

String a = "a";
a = "helloWorld";

在上述代码中,变量a首先指向了字符串"a",而后改变了变量a的指向,a指向了另一个常量"helloWorld",一般来说,常量"a"仍存储在常量池中,并未改变常量"a"的内容。

public class FinalTest {

    public static void main(String[] args) {
        final Money money1 = new Money(20);
        final Money money2 = new Money(40);
        System.out.println(money1.getValue());
        money1.setValue(100);
        System.out.println(money1.getValue());
        
        money1 = money2;	//报错

    }
    
    static class Money {
        private int value;
        public Money(){
        }
        public Money(int value) {
            this.value = value;
        }
        public int getValue() {
            return value;
        }
        public void setValue(int value) {
            this.value = value;
        }
    }
}

在上述代码中,money1money2分别指向一个Money对象,final修饰的变量指向的内容是可以更改,但是无法更改money1的指向。

二、Final修饰类和方法

1、final修饰的类不可以被继承

  • 所以final不能修饰抽象类,因为抽象类是要被继承的
  • 如果你不想让别人继承也可以用final修饰,例如String

2、final修饰方法不能被重写

  • final修饰方法,则方法不能被重写,但是可以被重载,注意重写和重载的区别

三、例题

以下说法错误的是( )

  • A.final修饰的方法不能被重载
    
  • B.final可以修饰类、接口、抽象类、方法和属性
    
  • C.final修饰的方法也不能被重写
    
  • D.final修饰的属性是常量,不可以修改
    

答案:AB

首先大家要知道final的意思为最终的,然后我来给大家细讲一下

A.final修饰方法后,方法是不可被重写的,因为它已经是“最终形态”了。但不会影响重载

B.final修饰类标志此类不可被继承。如果final可以标志抽象类和接口,抽象类不能继承?接口不准实现?

那还要来什么意义,所以final不能修饰抽象类和接口

C.题目中这个也字就是来误导人的,同A一样解释过了,final修饰的方法不可重写

D.这道题不能太钻牛角尖,final确实是修饰变量,只不过被修饰过的变量不能再变了,既然变量不能再变了我们就可以把它当做常量。


解析:链接:https://www.nowcoder.com/questionTerminal/e78e3374a8a84abbb2fc49c332ed9b3e
来源:牛客网

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值