第十五章 final关键字

1 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联合使用,称为“常量”。
 

 

 

 

posted @   路走  阅读(108)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示