Java-关键字final详解(public static final)

一、final修饰类

B类继承A类,相当于对A类的功能进行扩展,如果不希望对A类进行扩展,可以给A类加final关键字,这样的话,A类就无法继承了。

源代码中String就是没有子孙的

 结论:final修饰的类无法被继承

二、final修饰的方法

 所以final修饰的方法无法覆盖和重写。

三、final修饰的变量

(1)局部变量

无法为最终变量进行赋值了。

final修饰的变量只能赋一次值。

final修饰的变量一旦赋上值就不能再重新赋值了。

(2)fina修饰的变量如果这个变量是一个"引用"会怎么样?

解析:s2里面最初分配了0x123,然而你再给final进行赋值就不行了,因为final修饰的变量只能赋一次值。

final修饰的引用:该引用只能指向1个对象,并且它只能永远指向该对象。并且该方法执行过程中,该引用指向该对象之后,该对象不会被垃圾回收期回收,直到当前方法结束,才会释放空间。

对象不能修改,里面的数据能修改吗?

可以的,虽然指向的对象不能修改,但是对象里面的数据可以修改。

 内存图

 

(3)fianl修饰实例变量 

变量age没有初始化,所以sun公司,由final修饰的实例变量,系统不管赋默认值,要求程序员必须手动赋值。

 

只要赶在系统赋默认值之前赋值就行。

系统赋默认值是在构造方法执行的时候赋值。

所以这样也是可以。

总结:final修饰的实例变量,系统不负责赋默认值,赋值要么在变量后面写上,要么在构造方法里面写。

四、final修饰常量

public class FinalTest04{
    public static void main(String [] args){
}
}

class Chinese{
    //身份证号
    String idCard;
    //姓名,对象不同姓名不一样
    String name;
    //国家的值是一个固定值:“中国”
    //实例变量在堆中,一个对象一份。100个对象100份。
    //实例变量既然使用final修饰了,说明该实例变量不会随着对象的变化而变化。
    //该实例变量前面应该添加:static关键字,变为静态的,存储在方法区
    static final String country="中国";
}

最终结果:

    static final联合修饰的变量称为"常量"。常量名建议全部大写,每个单词之间采用下划线衔接。

常量:实际上常量和静态变量一样,区别在于:常量的值不能变,常量和静态变量,都是存储在方法区,并且都是在类加载时初始化。

五、总结

(1)final修饰的类无法继承

(2)final修饰的方法无法覆盖

(3)final修饰的变量只能赋一次值。

(4)final修饰的引用一旦指向某个对象,则不能再重新指向其他对象,但该引用指向的对象内部的数据时可以修改的。

(5)final修饰的实例变量必须手动初始化,不能采用系统默认值。

(6)final修饰的实例变量一般都和static联合使用,称为常量。

猜你喜欢

转载自blog.csdn.net/MyxZxd/article/details/105908785