About Me
欢迎各位读者访问,大家一起学习。
优秀是一种习惯♡♡♡
做更好的自己!
本人见识有限,写到博客难免有错误或疏忽的地方,还望各位大佬多多指点,在此表示感激不尽。♡♡♡
一:final关键字
-
final是什么?
final是java中的一个关键字,用来修饰类,方法,变量。一旦使用final关键字修饰,将不能再次改变这个引用。final也被称为**最终的**,不可改变的。
-
final的特点?
-
final表示最终的,不可改变的。
-
final修饰的局部变量,只能赋一次值。
public static void main(String[] args) { //定义一个局部变量用final修饰 final int i = 100; //被final修饰的局部变量无法重新赋值 //i = 300; //报错 }
//使用final声明一个局部变量k final int k; //第一次给k赋值 k = 100; //编译成功 //第二次给k赋值 //k = 200; //编译失败:因为使用final修饰的局部变量只能赋一次值 System.out.println(k);
-
final修饰的方法,无法被覆盖重写
//定义一个父类A class A { //使用final修饰method方法 public final void method() { } } //子类B继承父类A class B extends A { // 下面会报错,因为使用final修饰的方法无法被覆盖重写 // @Override // public void method() { // super.method(); // } }
-
final修饰的类,无法被继承。
//定义一个父类A final class A { } //子类B继承父类A //会报错:因为父类使用final关键字修饰,所以子类无法继承父类 //class B extends A { //}
-
final修饰的引用,只能指向一个对象。
使用final修饰的引用,永远只能指向一个对象,无法在指向其他对象,并且指向的对象不会被垃圾回收机制回收,直到方法结束才会释放空间。
注意:虽然final指向的对象A后不能在指向其他对象,但是对象A内部的数据还是可以修改。
public class FinalTest03 { public static void main(String[] args) { //创建一个person对象 Person p = new Person(20); //打印输出age System.out.println(p.age); //20 //创建一个Person对象使用final修饰 final Person p1 = new Person(30); //编译报错,因为不管变量是引用变量还是成员变量只要被final修饰都只能赋值一次值 //p1 = new Person(40); //编译报错 //p1 = null; //编译报错 p1.age = 40; //编译成功 System.out.println(p1.age); //40 } } //定义一个person对象 class Person { int age; //无参构造 Person(){ } //有参构造 Person(int age){ this.age = age; } }
-
内存图理解:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LlInvYdA-1636361416778)(https://gitee.com/tornado010930/images/raw/master/image-20211108144914330.png)]
-
final修饰的实例变量必须手动初始化,不能采用系统默认值。
final修饰的实例变量,系统不负责赋默认值,程序员必须手动赋值。这个手动赋值在变量后面赋值可以,在构造方法中赋值也可以。
class Hello{ //使用final修饰的实例变量必须手动赋值 final int a = 100; //可以在构造方法中赋值,但是必须赋值。 final String b; Hello(){ this.b = "HelloWorld"; } }
-
final修饰的实例变量一般和static联合使用,称为常量。
使用final修饰的变量不能改变,如果要是创建100个对象,就会在堆内存中开辟100块空间,而其中被final修饰的值都是相同的。所以这样会耗费空间,所以使用static修饰之后就会随类的加载而加载。一个类中只有一份,所有的对象共有,存储在方法区,经常被称为常量。常量一般全部为大写字母,如果有多个字母可以使用下划线分割:例如 static final Double PI = 3.1415926;
/** * @author Tornado * @date 2021/11/8 16:10 */ public class FinalTest05 { public static void main(String[] args) { //因为使用static修饰所以直接通过类名.调用 String country = Person01.COUNTRY; System.out.println(country); //中国 } } class Person01{ String name; int age; //使用static和final修饰属于常量 static final String COUNTRY = "中国"; }
不要在最能吃苦的年纪选择了安逸!!! — Tornado♥