java final关键字 详解

简介: java final关键字 内容分享,本篇博文为java 面向对象三大特性——多态篇的补充。
  • 概述:
  • 作用:
  • 细节:
  • 演示:
  • 总结:

一、概述 :

final [ˈ faɪnl],最终的,最后的,决定性的,不可改变的。final作为Java中的一个关键字可以用来修饰方法,和变量。(但final不能修饰构造器!)

二、作用 :

①修饰类—— 被final修饰的类不能被继承,但该类可以去继承别的 (没有被final修饰的 )类 ,例如String类和System类,它们被final修饰,是不可以被继承的,但是它们有自己的父类——即顶层父类Object类。还有一点需要注意: 被final修饰的类 虽然不能被继承,但 可以被实例化,即我们可以创建该类对象 ②修饰方法—— 被final修饰的方法不能被子类重写,但可以被子类继承并使用(在满足访问权限规则的前提下) 。注意,修饰方法时, final关键字不能与abstract关键字共存 ;因为我们前面在讲抽象类时说过,abstract修饰的方法是必须被非抽象子类重写的。 ③修饰变量—— 这里修饰的”变量“其实又可以细分为成员变量和局部变量 被final修饰的变量称为最终变量,即常量——成员常量和局部常量 常量只能赋值一次,不能被二次更改 关于 常量的命名 ,我们在Java 命名规范中已经说过,常量名所有字母都大写,多个单词之间用下划线隔开。eg : MAX_VALUE(最大值)。 若final关键字修饰的是一个引用类型变量,则该引用指向的地址值无法改变。(相当于一个 固定指针 )PS : 但是,我们不建议使用final修饰引用类型数据,因为通过引用,仍然可以修改堆空间中真正的对象的内部数据,实际意义并不大。

三、细节 :

1.关于成员常量和局部常量的初始化问题 :

当final修饰的是成员变量,即final修饰属性时。该成员常量必须进行初始化。要么就在定义成员常量时对它赋初值来初始化;如果在定义成员常量时没有赋初值——那么要么在构造器中进行初始化;要么在代码块中进行初始化。

而对于final修饰的局部变量,即局部常量——局部常量如果未被使用,可以不赋初值;但如果局部常量被调用了,就必须赋初值。

2.关于“画蛇添足,冠上加冠”:

一般地,如果一个类已经被final关键字修饰,那么该类中的方法是没有必要再次用final修饰的。这是因为用final修饰方法的目的就是为了不让该方法被子类重写;而final修饰的类本身就已经不能被继承了,又谈何重写呢?

3.关于常见的final类:

除了上文中提到的String类和System类,java中所有的包装类都被final关键字修饰了。也就是说,所有的包装类都不能被继承

包装类包括了Byte, Short, Integer, Long, Character, Float, Double, Boolean共八种,其实就是java中八种基本类型对应的引用类型。(关于包装类,我们在讲到下一章内容时会专门出一篇博文,这里大家先了解一下即可。)

4.关于静态常量和公有静态常量:

静态常量指的是static和final共同修饰的变量。因为用到了static关键字的知识,所以相关内容up放在了static关键字的万字详解篇,大家可以看完这篇博文后再返回来,点击链接跳转进去查看,里面有目录,直接找到"公有静态常量"和"公有静态常量的演示"即可。

四、演示 :

1.演示Ⅰ——final修饰类的演示

up以Fruit类和Grape类为栗,当我们用final修饰Fruit类时,Fruit类将无法被Grape类继承。如下GIF演示动图 :

image.png


2.演示Ⅱ——final修饰方法的演示

up仍然以Fruit类和Grape类为栗,增加Test类作为测试类。在Furit中定义一个juice(榨果汁)方法,并且在子类Grape中重写该方法。

Fruit类,Grape类,Test类代码如下 :

packageknowledge.polymorphism.about_final.demonstration;
publicclassFruit {
privateStringfruit_name;
publicStringgetFruit_name() {
returnfruit_name;
    }
publicvoidsetFruit_name(Stringfruit_name) {
this.fruit_name=fruit_name;
    }
publicvoidjuice() {
System.out.println(getFruit_name() +"可以榨果汁儿!");
    }
}
classGrapeextendsFruit {
@Overridepublicvoidjuice() {
System.out.println(getFruit_name() +"可以榨葡萄汁儿!");
    }
}
classTest {
publicstaticvoidmain(String[] args) {
Fruitfruit=newGrape();
fruit.setFruit_name("葡萄🍇");
fruit.juice();
    }
}

运行结果 :

image.png

接着,我们为juice方法添加修饰符final修饰符,这时子类将不能重写juice方法,否则IDEA会报错。如下GIF演示动图 :

image.png


3.演示Ⅱ——final修饰变量的演示

up以Fruit类为演示类,以Test类作为测试类。在Furit类中分别定义四个变量name, color, size, sweetness,后三个变量使用final修饰(即后三个均是成员常量),(注意常量的命名规则),并分别演示成员常量初始化的三种方式。

Fruit类,Test类代码如下 :

packageknowledge.polymorphism.about_final.demonstration;
publicclassFruit {
//这是变量,可以二次更改值。privateStringname=null;
//通过setName方法可以修改name变量的值。publicvoidsetName(Stringname) {
this.name=name;
    }
publicStringgetName() {
returnname;
    }
//这是常量,一旦赋值后,不可进行二次更改。//成员常量第一种初始化方式————在定义时就直接赋值:finalStringCOLOR="水果的颜色是五颜六色";
//成员常量第二种初始化方式————在非静态代码块中赋值:finalStringSIZE;
        {    //非静态代码块SIZE="水果的尺寸是能大能小";
        }
//成员常量第三种初始化方式————在构造器中赋值finaldoubleSWEETNESS;
publicFruit() {
SWEETNESS=9.0;
        }
publicvoidpart() {
finalStringHAHA;
HAHA="哈哈哈哈哈哈哈哈~";
System.out.println("局部常量如果被调用就必须初始化,"+HAHA);
    }
}
classTest {
publicstaticvoidmain(String[] args) {
Fruitfruit=newFruit();
System.out.println("fruit's color = "+fruit.COLOR);
System.out.println("fruit's size = "+fruit.SIZE);
System.out.println("fruit's sweetness = "+fruit.SWEETNESS);
System.out.println("-------------------------------------");
fruit.part();
    }
}

运行结果 :

image.png

五、总结 :

final是Java中定义常量的标志。大家一定要把final关键字的作用和细节仔细琢磨琢磨,自己动手练练,去做up出的课后习题。有疑问大家可以共同交流,感谢阅读!

System.out.println("END---------------------------------------------------------");

目录
相关文章
|
3月前
|
存储 缓存 安全
除了变量,final还能修饰哪些Java元素
在Java中,final关键字不仅可以修饰变量,还可以用于修饰类、方法和参数。修饰类时,该类不能被继承;修饰方法时,方法不能被重写;修饰参数时,参数在方法体内不能被修改。
44 3
|
29天前
|
Java 编译器 开发者
Java中的this关键字详解:深入理解与应用
本文深入解析了Java中`this`关键字的多种用法
115 9
|
2月前
|
存储 缓存 Java
Java 并发编程——volatile 关键字解析
本文介绍了Java线程中的`volatile`关键字及其与`synchronized`锁的区别。`volatile`保证了变量的可见性和一定的有序性,但不能保证原子性。它通过内存屏障实现,避免指令重排序,确保线程间数据一致。相比`synchronized`,`volatile`性能更优,适用于简单状态标记和某些特定场景,如单例模式中的双重检查锁定。文中还解释了Java内存模型的基本概念,包括主内存、工作内存及并发编程中的原子性、可见性和有序性。
Java 并发编程——volatile 关键字解析
|
1月前
|
JSON Java 数据挖掘
利用 Java 代码获取淘宝关键字 API 接口
在数字化商业时代,精准把握市场动态与消费者需求是企业成功的关键。淘宝作为中国最大的电商平台之一,其海量数据中蕴含丰富的商业洞察。本文介绍如何通过Java代码高效、合规地获取淘宝关键字API接口数据,帮助商家优化产品布局、制定营销策略。主要内容包括: 1. **淘宝关键字API的价值**:洞察用户需求、优化产品标题与详情、制定营销策略。 2. **获取API接口的步骤**:注册账号、申请权限、搭建Java开发环境、编写调用代码、解析响应数据。 3. **注意事项**:遵守法律法规与平台规则,处理API调用限制。 通过这些步骤,商家可以在激烈的市场竞争中脱颖而出。
|
2月前
|
缓存 安全 Java
Java volatile关键字:你真的懂了吗?
`volatile` 是 Java 中的轻量级同步机制,主要用于保证多线程环境下共享变量的可见性和防止指令重排。它确保一个线程对 `volatile` 变量的修改能立即被其他线程看到,但不能保证原子性。典型应用场景包括状态标记、双重检查锁定和安全发布对象等。`volatile` 适用于布尔型、字节型等简单类型及引用类型,不适用于 `long` 和 `double` 类型。与 `synchronized` 不同,`volatile` 不提供互斥性,因此在需要互斥的场景下不能替代 `synchronized`。
2274 3
|
3月前
|
JavaScript 前端开发 Java
java中的this关键字
欢迎来到我的博客,我是瑞雨溪,一名热爱JavaScript与Vue的大一学生。自学前端2年半,正向全栈进发。若我的文章对你有帮助,欢迎关注,持续更新中!🎉🎉🎉
71 9
|
3月前
|
设计模式 JavaScript 前端开发
java中的static关键字
欢迎来到瑞雨溪的博客,博主是一名热爱JavaScript和Vue的大一学生,致力于全栈开发。如果你从我的文章中受益,欢迎关注我,将持续分享更多优质内容。你的支持是我前进的动力!🎉🎉🎉
68 8
|
3月前
|
Java
final 在 java 中有什么作用
在 Java 中,`final` 关键字用于限制变量、方法和类的修改或继承。对变量使用 `final` 可使其成为常量;对方法使用 `final` 禁止其被重写;对类使用 `final` 禁止其被继承。
59 2
|
3月前
|
Java 开发者
在Java多线程编程的世界里,Lock接口正逐渐成为高手们的首选,取代了传统的synchronized关键字
在Java多线程编程的世界里,Lock接口正逐渐成为高手们的首选,取代了传统的synchronized关键字
64 4
|
4月前
|
Java 程序员
在Java编程中,关键字不仅是简单的词汇,更是赋予代码强大功能的“魔法咒语”。
【10月更文挑战第13天】在Java编程中,关键字不仅是简单的词汇,更是赋予代码强大功能的“魔法咒语”。本文介绍了Java关键字的基本概念及其重要性,并通过定义类和对象、控制流程、访问修饰符等示例,展示了关键字的实际应用。掌握这些关键字,是成为优秀Java程序员的基础。
59 3