• Thinking in java 4学习(三)final,protected关键字


    protected关键字:

    对于类用户而言这是private的,但对于任何继承于此类的导出类或其他任何位于同一个包内的类来说,他是可以访问的。

    final关键字:

    (1)final数据

    1、final 数据 要么在定义时就初始化 ,要么在每个构造器中初始化,否则编译不过。

    2、final修饰基本类型使数值恒定不变;final修饰的对象引用使引用恒定不变,但对象自身是可以被修改的。

    (2)final方法

    使用final方法原本有两个原因(一)把方法锁定,防止任何继承类修改它(二)出于效率。但现在只需要考虑第一个原因

    final vs private

    类中所有的private方法都隐式地指定为final的(因为无法取用private方法,也就无法覆盖它)

    (3)final类

    final类不可以被继承

    public class Value {
    
        int i;
        public Value(int i){
            this.i = i;
        }
    }
    import java.util.Random;
    
    public class FinalData {
    
        private static Random rand = new Random(47);
        private String id;
    
        public FinalData(String id) {
            this.id = id;
        }
    
        private final int valueOne = 9;
        private static final int VALUE_TWO = 99;
        public static final int VALUE_THREE = 39;
        private final int i4 = rand.nextInt(20);
        static final int INT_5 = rand.nextInt(20);
        private Value v1 = new Value(11);
        private final Value v2 = new Value(22);
        private static final Value VAL_3 = new Value(33);
        private final int[] a = { 1, 2, 3, 4, 5, 6 };
    
        public String toString() {
            return id + ":" + "i4 = " + i4 + ". INT_5 = " + INT_5;
        }
    
        public static void main(String[] args) {
            FinalData fd1 = new FinalData("fd1");
            // !fd1.valueOne++; //Error :The final field FinalData.valueOne cannot
            // be assigned
            fd1.v2.i++;
            fd1.v1 = new Value(9);
            for (int i = 0; i < fd1.a.length; i++) {
                fd1.a[i]++;
            }
            // !fd1.v2 = new Value(0); //Error :The final field FinalData.valueOne
            // cannot be assigned
            // !fd1.VAL_3 = new Value(1);//Error :The final field FinalData.VAL_3
            // cannot be assigned - The static field FinalData.VAL_3 should be
            // accessed in static way
            // !fd1.a = new int[3]; ////Error :The final field FinalData.valueOne
            // cannot be assigned
            System.out.println(fd1);
            System.out.println("Creating new FinalData");
            FinalData fd2 = new FinalData("fd2");
            System.out.println(fd1);
            System.out.println(fd2);
        }
    
    }

    输入结果:

    fd1:i4 = 15. INT_5 = 18
    Creating new FinalData
    fd1:i4 = 15. INT_5 = 18
    fd2:i4 = 13. INT_5 = 18

    这里有个疑问:i4和INT_5都是随机数,为何无论运行多少次main方法结果都是一样的?

    详见第七章:复用类

  • 相关阅读:
    iOS开发实用技术之MapKit框架的使用
    iOS开发实用技术之CoreLocation框架
    iOS开发UI之KVC(取值/赋值)
    iOS开发UI之自定义View
    iOS开发UI之UIButton的基本使用
    iOS开发UI之UIImageView的基本使用
    iOS开发UI之 UILabel的基本使用
    iOS开发UI之UILabel的基本使用
    tensorflow 梯度下降以及summary
    leetcode_38
  • 原文地址:https://www.cnblogs.com/vincentren/p/5662074.html
Copyright © 2020-2023  润新知