美文网首页
final修饰符

final修饰符

作者: 李霖神谷 | 来源:发表于2017-03-29 14:50 被阅读9次

final修饰符是java中比较简单的修饰符,但也是一个被误解最多的修饰符。
final可以修饰变量,被final修饰的变量被赋初始化值之后,不能对它重新赋值。
final可以修饰方法,被final修饰的方法不能被重写。
final可以修饰类,被final修饰的类,不能派生子类。
对于普通的实例变量,java程序可以对他执行默认初始值,但是对于final实例变量则必须由程序员显示指定初始值。
定义final实例变量时指定初始
在非静态初始化块中为final实例变量指定初始化值。
在构造器中为final实例变量指定初始化值。

public class Demo {
    final int var1 = "lishuai".length();
    final int var2;
    final int var3;
    {
        var2 = "liqian".length();
    }

    public Demo() {
        this.var3 = "limin".length();
    }
    public static void main(String[] args) {
        Demo d=new Demo();
        System.out.println(d.var1);
        System.out.println(d.var2);
        System.out.println(d.var3);
    }
}

需要指出var1,var2,var3虽然在不同地方指定初始化值,但是经过变一起的处理,这三种方式都会被抽取到构造器中附初始值。
对于final类变量而言,必须显示的指定初始值,而且只能在两个地方指定初始值。
定义final类变量时指定初始值。
在静态初始化块中指定初始值。

public class Demo{
    final static int var1="mahuongmei".length();
    final static int var2;
    static{
        var2="madongmei".length();
    }
    public static void main(String[] args) {
        System.out.println(Demo.var1);
        System.out.println(Demo.var2);
    }
}

需要指出的是,经过编译器的处理,这两种初始化方式都会抽取到静态初始化块中被赋予初始值。

class Price{
    final static Price INSTANCE=new Price(2.8);
    static double iniprice=20;
    double currentprice;
    public Price(double discount){
        currentprice=iniprice-discount;
    }
}
public class Demo{
    public static void main(String[] args) {
        System.out.println(Price.INSTANCE.currentprice);
        Price p=new Price(2.8);
        System.out.println(p.currentprice);
    }
}
class Price{
    final static Price INSTANCE=new Price(2.8);
    final static double iniprice=20;
    double currentprice;
    public Price(double discount){
        currentprice=iniprice-discount;
    }
}
public class Demo{
    public static void main(String[] args) {
        System.out.println(Price.INSTANCE.currentprice);
        Price p=new Price(2.8);
        System.out.println(p.currentprice);
    }
}

对比上面两个输出结果,不难发现,当使用final修饰类变量时,如果定义该java类变量时指定了初始值,而且该初始值可以在编译时期就被确定下来(int double Strng类型)系统将不会在静态初始化块中对类变量初始化,而是在类定义中直接使用该初始值。java将其当成“宏变量”处理。

相关文章

  • kotlin修饰符

    1. open、final 和 abstract 修饰符:默认为 final 修饰符相关成员评注final不能被重...

  • final修饰符

    final修饰符是java中比较简单的修饰符,但也是一个被误解最多的修饰符。final可以修饰变量,被final修...

  • Java中的final修饰符

    Java中的final修饰符 Java中final修饰符既可以修饰变量、方法,也可以修饰类。用final修饰的变量...

  • Java 权限修饰符

    修饰符:权限修饰符:private,默认的,protected,public状态修饰符:static,final抽...

  • Java基础_final修饰符

    final修饰变量 final关键字可以修饰类、变量、方法。 final修饰符 final修饰的变量不可被改变,一...

  • Swift中的final修饰符

    Swift中的final修饰符 Swift中的final修饰符可以防止类(class)被继承,还可以防止子类重写父...

  • 使用Powermock模拟final类或方法

      对于使用final修饰符修饰的类或方法,都是不能被继承的,Mockito也不支持mock带final修饰符的类...

  • 类修饰符和方法变量修饰符

    类修饰符 interface abstract final 方法及变量修饰符 public protected p...

  • Java基础知识整理-String类

    先思考下以下问题: 1.String类能被继承吗? String类被final修饰符所修饰,被final修饰符所修...

  • java代码开发注意事项

    1、尽量指定类的final修饰符 带有final修饰符的类是不可派生的。 在Java核心API中,有许多应用fin...

网友评论

      本文标题:final修饰符

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