美文网首页Java
final关键字

final关键字

作者: 许宏川 | 来源:发表于2015-07-22 21:34 被阅读78次

    final可以用于修饰属性、方法和类。我从大到小一一说明一下。

    修饰类##

    被final修饰的类无法被继承

    新建立一个finalDemo项目,新建A、B、C三个类。其中B用final修饰,让C分别继承A和B,结果是C继承B时会报错。

    public class A {
    
    }
    
    final public class B { //用final修饰的类,无法被继承
    
    }
    
    /*
    报错!类B被final修饰了,无法继承
    public class C extends B {
    }
    */
    
    public class C extends A {
    
    }
    

    修饰方法##

    被final修饰的方法有两条规矩。

    • 第一,被final修饰的方法被继承后不能被重写。

    在类A添加一个show方法,用final修饰。在继承类A的类C里重写show方法,结果报错了,因为show方法被final修饰所以无法被重写。

    public class A {
        //被final修饰的方法无法被重写
        protected final void show() {
    
        }
    
    }
    
    public class C extends A {
    
        /*
        报错!show()在父类A里被定义为final,无法被重写
        @Override
        protected void show() {
            super.show();
        }
        */
    }
    
    • 第二,构造构造方法无法被final修饰

    在类A添加以下构造方法将会报错。

    /*
        报错!构造方法无法被定义为final
        public final A() {
    
        }
        */
    

    修饰属性##

    被final修饰的变量被赋值后无法再修改值,也就是说fianl变量只能被赋值一次。
    用final修饰属性和两种情况讨论,一种是成员变量第二种是局部变量。

    • 因为成员变量会自动初始化,例如int默认值为0,double为0.0,boolean为false。也就是说自动初始化已经占用了唯一一次赋值的机会,而0、0.0和false又没什么意义。所以Java要求被final修饰的成员变量必须赋一个初始值。

    在类A里添加以下两个final成员变量,其中s1因为赋初始值所以报错。

        //final String s1; //报错!成员变量被final修饰必须赋初始值
        final String s2 = "赋了初始值就不会报错了";
    
    • 因为局部变量不会自动初始化,所以声明一个被final修饰的局部变量后不会要求立刻赋值。但是随后赋值之后就不能再更改值了,因为被final修饰的变量有且仅有一次赋值的机会。

    在类A的show方法里添加成员final局部变量i,先声明不赋初始值程序正常。接着赋一个初始值10,程序正常。
    再赋值为20,程序报错,因为final变量一旦初始化后则无法变更值。

       final int i; //可以不赋值,因为局部变量不会自动初始化
       i = 10; //第一次赋值
       //i = 20; //报错!因为final
    

    本文代码下载百度网盘

    相关文章

      网友评论

        本文标题:final关键字

        本文链接:https://www.haomeiwen.com/subject/uxnpqttx.html