第十五章 final关键字
1.1 final修饰的类无法被继承/final修饰的方法无法覆盖/final修饰的局部变量
/*
final
1、final是java语言中的一个关键字。
2、final表示最终的,不可变的。
3、final可以修改变量以及方法,还有类等。
4、final修饰的变量?
final修饰的局部变量,一旦赋值不能重新赋值。
final修饰的变量,只能赋一次值。
5、final修饰的方法?
final修饰的方法无法被覆盖,被重写。
6、final修饰的类?
final修饰的类无法继承。
*/
public class FinalTest01{
public static void main(String[] args){
// 局部变量
int i = 100;
// 重新赋值
i = 200;
// 局部变量
final int k = 100;
// 全新赋值
// 错误:无法为最终变量分配值
// k = 300;
final int m;
// 第一次赋值
m = 200;
// 重新赋值
// 编译报错
m = 300;
}
}
final class A{
}
// B类继承A类,相当于对A类的功能进行扩展。如果你不希望别人对A类进行扩展。
// 你可以给A类加final关键字,这样的话A类就无法继承了。
// 错误:无法从最终的A进行继承
/*
class B extends A{
}
*/
class C{
public final void doSome(){
System.out.println("C's doSome...");
}
}
class D extends C{
// 编译报错,D中的doSome无法覆盖C中的doSome
public void doSome(){
System.out.println("D's doSome...");
}
}
1.2 final修饰引用
/*
final
1、final是java语言中的一个关键字。
2、final表示最终的,不可变的。
3、final可以修改变量以及方法,还有类等。
4、final修饰的变量?
final修饰的局部变量,一旦赋值不能重新赋值。
final修饰的变量,只能赋一次值。
5、final修饰的方法?
final修饰的方法无法被覆盖,被重写。
6、final修饰的类?
final修饰的类无法继承。
*/
public class FinalTest01{
public static void main(String[] args){
// 局部变量
int i = 100;
// 重新赋值
i = 200;
// 局部变量
final int k = 100;
// 全新赋值
// 错误:无法为最终变量分配值
// k = 300;
final int m;
// 第一次赋值
m = 200;
// 重新赋值
// 编译报错
m = 300;
}
}
final class A{
}
// B类继承A类,相当于对A类的功能进行扩展。如果你不希望别人对A类进行扩展。
// 你可以给A类加final关键字,这样的话A类就无法继承了。
// 错误:无法从最终的A进行继承
/*
class B extends A{
}
*/
class C{
public final void doSome(){
System.out.println("C's doSome...");
}
}
class D extends C{
// 编译报错,D中的doSome无法覆盖C中的doSome
public void doSome(){
System.out.println("D's doSome...");
}
}
1.3 final修饰实例变量
/*
final修饰的实例变量呢?
final修饰的变量只能赋值一次。
你是否还记得:实例变量如果没有手动赋值的话,系统会赋默认值。
结论:
final修饰的实例变量,系统负责赋默认值,要求程序员必须手动赋值。
这个手动赋值,在这是后面赋值可以,在构造方法中赋值也可以。
实例变量在什么时候赋值(初始化)?
构造方法执行的过程中赋值。(new的时候赋值)
*/
public class FinalTest03{
public static void main(String[] args){
}
}
class User{
// 实例变量
// 编译器报错
// final int age;
// 实例变量
// 可以,因为程序员手动赋值了
final double height = 1.8;
// 以下代码联合起来,weight变量也是赋值一次。
// 实例变量
final double weight;
// 构造方法
public User(){
this.weight = 80; // 只要在系统赋默认值之前赋值就行
this.weight = 81; // 这个可以吗?不行。
}
}
1.4 常量
/*
final修饰的实例变量
final修饰的实例变量,必须手动赋值。
final修饰的变量,只能赋一次值。
final修饰的实例变量一般添加static修饰。
结论:
static final联合修饰的变量称为“常量”
常量名建议全部大写,每个单词之日采用下划线连接
常量:实际上常量和静态这是一样,区别在于:
常量的值不能变。
常量和静态变量,都是存储在方法区,并且都是在类加载时初始化。
常量一般是公开的。
*/
public class FinalTest04{
public static void main(String[] args){
System.out.println(Chinese.COUNTRY);
// 错误:无法为最终变量COUNTRY分配值
// Chinese.COUNTRY = "美国"; // 常量是无法重新赋值的。
}
}
class Chinese{
// 身份证号,每个人都不一样,对象级别的
String idCard;
// 姓名,对象不同姓名不一样。
String name;
// 国家的值是一个固定值:“中国”
// 实例变量在堆中,一个对象一份,100个对象100份
// 实例变量既然使用final修饰了,说明该变量值不会随着对象的变化而变化。
// 该实例变量前面应该添加:static关键字,变为静态的,存储在方法区。
static final String COUNTRY;
}
class MyMath{
// 数学中的pai是不会变的。
public static final double PI = 3.1415926;
}
1.5 final总结
final修饰的类无法继承。
final修饰的方法无法覆盖
final修饰的变量只能赋一次值。
final修饰的引用一旦指向某个对象,则不能再重新指向其它对象,但是其内部的值是可以修改的。
final修饰的实例变量必须手动初始化,不能采用系统默认值。
final修饰的实例变量一般和static联合使用,称为“常量”。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?