final----来自java中的关键字

final

1)final可以修饰类,方法,变量
2)final修饰的类不可以被继承
3)final修饰的方法不可以被覆盖(重写)
4)final修饰的变量是一个常量,只能被赋值一次



什么时候将变量修饰成final呢???


1.通常在程序中使用一些不会变化的数据,也就是常见的一些常量值,
比如3.14,这个数直接使用是可以的,但并不利于阅读,所以一般情况下,
都会被该数据起个容易阅读的名字
2.final修饰的常量定义一般都有书写规范,被final修饰的常量名称,所有字母都大写如:double PI=3.14;
3.如果由多个单词组成每个单词间用下划线连接MY_NAME

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

final class A{
    //A 是没有子孙的
}
class B extends A{
    //错误的, 无法从最终类A进行继承
    //B类继承A类 相当于对A类功能进行扩展
    //如果不希望别人对A类进行扩展,可以给A类加final关键字,如String类
}

final修饰的方法(无法被覆盖,重写)

class C{
    public final void doSome(){
       System.out.println("C's doSome...")
    } 
}
class D extends C{
 //错误,无法覆盖
 /*   public  void doSome(){
     System.out.println("D's doSome...")
    } */
}

final修饰的局部变量(只能赋一次值)

public class FinalTest01{
    public static void main(String[]args){
        //局部变量
        int i=100;
        //重新赋值, 没问题
        i=200;
        
        // 再定义一个局部变量 
        final int k=100;
        //重新赋值
        //错误: 无法为最终变量k分配值
       // k=300;
    }
}

final修饰的实例变量(必须手动赋值)

/*
一般情况下
实例变量如果还没有赋值的话,系统会赋默认值

final 修饰实例变量:
系统不负责赋默认值,要求程序员必须手动赋值,只能赋一次,
这个手动赋值,在变量后面赋值可以,在构造方法中赋值也可以



*/
public class FinalTest02(){
    public static void main(String[]args){
        
    }
}


class User{
    //实例变量
    
    //错误: 变量age未在默认构造器中初始化
    //final int age;
    final int age=10;
    
    //在构造方法中赋值 weight只赋一次值
    final double weight;
    //构造方法
    public User(){   
        this.weight=80;
        //系统赋默认值在这个时候,final修饰后,系统不会赋值
        //this.weight=0;
     
    }
    
    
}

常量

/*
上一个例子的结论
   final修饰的实例变量。必须手动赋值
   final修饰的变量,只能赋一次值

final修饰的实例变量一般添加static修饰 变成静态的,存储在方法区,节省空间。

结论:static final联合修饰的变量成为“常量”
     常量名要全部大写,每个单词之间采用下划线衔接
     
常量:实际上和静态变量一样 区别在于:常量的值不能变。
     
     常量和静态变量,都是存储在方法区,并且都是在类加载时初始化
     
     常量一般都是公开的:public的。

*/

public class FinalTest03{
    public static void main(String[]args){
        System.out.println(Chinese.COUNTRY);
        //错误:无法为最终变量COUNTRY赋值
        //Chinese.COUNTRY="美国"; //常量是无法被重新赋值的
    }
}

class Chinese{
    //身份证号,每个人都不一样
    String idCard;
    String name;
    String birth;
    //国家的值是一个固定值:"中国"
    //实例对象在堆中,一个对象一份 一百个对象一百份
    //实例变量既然用final修饰了,说明该实例变量值不会随着对象的变化而变化
public static  final String COUNTRY="中国";
}

final修饰引用(只能指向一个对象)

/*
final修饰的变量 如果这个变量是一个"引用"会怎么样?
  final修饰的变量只能赋一次值
  "引用"是否是一个变量 :是
  
  总结:final修饰的引用
       1.该引用只能指向1个对象 并且它只能永远指向该对象
       无法再指向其他对象
       2.在该方法执行过程中,该应用指向该对象之后,该对象不会          被垃圾回收器回收,直到当前方法结束,才会释放空间
       3.虽然final的引用指向对象A后,不能重新指向对象B
         但是对象A内部的数据可以被修改
*/
public class FinalTest04{
    public static void main(String[]args){
        Person p=new Person(20);
        System.out.println(p1.age);
        //--------------------------------------
        // 代码不管怎么变化,p也是一个变量,只不过他是引用
        
        //错误:无法为最终变量p分配值 地址不能改变
    //   final Person p=new Person(30);//0x1234;
     //   p=new Person(30);//0x2589
        
        
    }
        
}
    
class Person{
    int age;
    public Person(){}
    public Person(int age){
        this.age=age;
    }
    
}

内存图

Guess you like

Origin blog.csdn.net/m0_60237095/article/details/121332127