final Java 关键字 深入浅出,简单理解

final
  • 定义
    • Java的关键字
    • 被修饰的变量是不可变的
  • 使用
    • 数据
      • 修饰基本数据类型
        • 基本数据类型不可变的是其内容
      • 修饰引用数据类型
        • 引用数据类型不可变的是其引用
        • 引用所指定的对象内容是可变的
    
public class Person {
        private String name;


        Person(String name){
            this.name = name;
        }


        public String getName() {
            return name;
        }


        public void setName(String name) {
            this.name = name;
        }
    }


    public class FinalTest {
        private final String final_01 = "chenssy";    //编 译期常量,必须要进行初始化,且不可更改
        private final String final_02;                //构造器常量,在实例化一个对象时被初始化


        private static Random random = new Random();
        private final int final_03 = random.nextInt(50);    //使用随机数来进行初始化


        //引用
        public final Person final_04 = new Person("chen_ssy");    //final指向引用数据类型


        FinalTest(String final_02){
            this.final_02 = final_02;
        }


        public String toString(){
            return "final_01 = " + final_01 +"   final_02  = " + final_02 + "   final_03 = " + final_03 +
                   "   final_04 = " + final_04.getName();
        }


        public static void main(String[] args) {
            System.out.println("------------第一次创建对象------------");
            FinalTest final1 = new FinalTest("cm");
            System.out.println(final1);
            System.out.println("------------第二次创建对 象------------");
            FinalTest final2 = new FinalTest("zj");
            System.out.println(final2);
            System.out.println("------------修改引用对 象--------------");
            final2.final_04.setName("chenssy");
            System.out.println(final2);
        }
    }


    ------------------
    Output:
    ------------第一次创建对象------------
    final_01 = chenssy   final_02 = cm   final_03 = 34    final_04 = chen_ssy
    ------------第二次创建对象------------
    final_01 = chenssy   final_02 = zj   final_03 = 46   final_04 = chen_ssy
    ------------修改引用对象--------------
    final_01 = chenssy   final_02 = zj   final_03 = 46   final_04 = chenssy

 

    • 方法
      • 被其标注的方法都是不能被继承,更改的
      • 使用原因
        • 进行方法锁定
        • 防止任何类对其修改
      • 父类的final方法不能被子类所重写即覆盖
        • 子类不能够存在与父类一模一样的方法
    
public class Custom extends Person{
        public void method1(){
            System.out.println("Person's  method1....");
        }
 
 
    //    Cannot override the final method from person:子类不能覆盖父类的final方法
    //    public void method2(){
    //        System.out.println("Person's method2...");
    //    }
    }

 

      • 如果某个类被修饰,表明该类为最终类
      • 它不希望也不允许被继承
      • 在程序设计中处于安全状态
      • 存在原因
        • 不允许该类存在任何变化
        • 也不允许它有子类
    • 参数
      • 被修饰的参数是不可变的
      • 如果在方法中修改了这个参数,编译器回提示你
        • The final local variable i cannot be assigned. It must be blank and not using a compound assignment。
      • 存在原因
        • 在匿名内部类中,为了保持参数的一致性,若所在的方法的形参需要被内部类里面使用时,该形参必须为 final
    
public class Custom {
        public void test(final int i){
            //i++;     ---final参数不可改变
            System.out.println(i);
        }
 
 
        public void test(final Person p){
         //p = new Person();    --final参数不可变
         p.setName("chenssy");
        }
    }

 

 
posted @ 2020-04-23 11:05  littlebob  阅读(167)  评论(0编辑  收藏  举报