韦德国际1946英国 > 计算机网络 > Java-final关键字,

原标题:Java-final关键字,

浏览次数:119 时间:2019-10-06

Java-final关键字,

final:最后的,到此结束

分三种情状:

1、修饰类

表示该类不可能被三番五次和扩充

final class A {}

class B extends A {}// 编译器报错,表示无法继承

2、修饰方法

子类不可能掩瞒和重写该办法

class A {
    final void method() {}
}

class B extends A {
    @override
    void method() {}// 编译器报错,无法重写该方法
}

3、修饰变量

对目的的话,保障变量的引用不改变,其值能够被改动

对中央类型数据时,保险值不变。修饰方法参数时也是同样

public class FinalDemo {

    public static void main(String[] args) {
        String a = "Hello2";
        final String b = "Hello";
        String c = b   2;
        System.out.println(a.equals(c));
        String d = "Hello";
        String e = d   2;
        System.out.println(a.equals(e));

        // 修改当前对象的数值
        final StringBuffer tempbuffer = new StringBuffer("Hello, world!");
        tempbuffer.append("This is final string!");

//        tempbuffer = new StringBuffer();// 无法重新引用新的数据
    }

}

 

final:末了的,到此停止分二种意况: 1、修饰类 表示该类无法被接续和庞大 final class A {} class B extends A {} // 编写翻译器报错,...

1.3 空白 final

所谓空白 final 指被声称为 final,但又未给定初值的域。但编译器又须求确定保证在利用前变量被赋值,因而java 供给空白 final 必得在构造器中赋值。静态空白 final 可在静态代码块中赋值,非静态空白 final 要在结构代码块或是每二个构造函数中赋值。

空白 final 为类使用者提供了越来越大的油滑,在确认保障变量只被赋值一回的同期,能够依据目的而有所区别。

如:

public class Test {

    private static final String STR = "str";
    private static final int A;
    private static final String STR1;

    static {  // 静态空白 final 只能在定义时赋值或在静态代码块中赋值
        A = 3;
        STR1 = "str1";
    }

    private final int b = 1;
    private final int c;
    private final String str;

    // 非静态空白 final 可在构造代码块中赋值
    {
        c = 1;
    }
    // 选择构造代码块赋值时只需在其中一个构造代码块中赋值即可
    {
    }

    // 选择构造函数赋值时必须在每一个构造函数中都进行赋值,因为编译器无法知道类使用者会选择哪一个构造函数构造对象
    public Test() {
        str = "str";
    }

    public Test(String s) {
        str = s;
    }
}

在String类型的变量中,不常候平常遇上如下意况:

1.2 final 修饰援引数据类型

final 修饰引用数据类型时,final 关键字使被修饰的变量的援引不能够更动,可是,对象自己却是能够修改的。

如:

public class Test {
    public final Te te = new Te();// te 为引用数据类型,且被 final 修饰
    public void fun(){
//        te = new Te(); // 试图给 te 修改引用,指向一个新的对象,此时编译会报错
        te.i = 10; // te 的内容可以修改(对象自身可以修改)
    }
    class Te{
        int i = 3;
    }
}

当变量被定义为 final ,同时 也被 static 修饰,表示该变量被起首化之后就占领着一段不能够改变的储存空间,而且只会有一份。

final 使变量不能够改改引用(基本数据类型时为值不能够修改),而 static 重申唯有一份。

public static final String = "str" // 所在类加载时会被初始化

;)

1.1 final 修饰基本数据类型

那类常量必得是骨干数据类型,用 final 修饰,在概念时就非得赋值,对于编写翻译期常量,编译器能够将该常量值代入任何用到它的总结式中,能够在编写翻译期试行总结式,缓慢搞定运维时担负。

如:

public final int i = 10; //定义时就赋值,基本数据类型
public final int[] is = {1,2,3}; //即 new int[]{1,2,3} 运行时才被确定,有 new 关键字,数组不是基本数据类型
public final String str = "str"; // String 不是基本数据类型

补充:java 中的基本数据类型,共 8 种:

  • byte 1字节
  • char 2字节
  • short 2字节
  • double 8字节
  • int 4字节
  • boolean 《 Java 虚构机标准》描述为 4 个字节,boolean 数组为 1 个字节,具体还要看设想机达成
  • float 4字节
  • long 8字节

在子类中另行定义了新的不二等秘书籍。

3. final 方法

接纳 final 修饰方法的原因有七个:

  1. 把措施锁定,以免任何承接类修改它的概念,那是由于设计思量,确认保障在持续中使艺术行为保全不改变,何况不会被遮掩
  2. 千古使用 final 修饰方法的第一个原因是功效,在 java 的先前时代完结中,将三个艺术指明为 final 后,编写翻译器将对准该方式的兼具调用转为内嵌调用,那将在放任自流水平上解除方法调用的支付,但当方法体积异常的大时,程序代码就能暴涨,这将促成内嵌调用不可能升高效用。在前不久的 java 版本中,设想机能够探测到那么些情形,并去掉那几个频率反而减弱的内嵌调用,由此不再须要运用 final 方法开展优化了

惟有在想明白幸免覆盖时,才应该利用 final 修饰方法

final修饰的类属性和变量属性必得求开展体现开首化赋值。

4. final 和 private 关键字

类中全体的 private 方法都隐式的钦定为 final 的、,由于不可能取用 private 方法,所以也就不能掩没它。能够对 private 方法增加 final 关键字修饰,但这并不可能给艺术增加任何额外的意义。

“覆盖”独有在某艺术是基类的接口的一片段时才面世,private 方法不属于类的接口的一有些,所以也就从不覆盖的传道,能够在子类中定义与父类中 private 方法一致具名的措施,但他俩相互仅仅是“具名一样”而已,别的并未有任何关系。

final修饰类即意味着此类已是“最终的、最后的”含义。由此,用final修饰的类不可能被持续,即无法享有本人的子类。要是视图对一个已经用final修饰的类进行三番两回,在编写翻译时期或爆发错误。

java - final 关键字

;)

java - final 关键字

在 java 中,final 关键字能够修饰类,方法和变量。被 final 修饰平常指“那是敬敏不谢改观的”。

对于相似的类属性和对象属性,由类和指标的发轫化进程中得以见见,首先都开展了私下认可开端化。然后对有显示赋值的变量才再拓宽体现发轫化

图片 1

Java-final关键字,。2. final修饰方法:

5. final 类

将有个别类全部概念为 final ,就表明你不筹算三番四遍该类,而且也不允许旁人承继。

final 类的域能够依据意愿选择是还是不是为 final,final 关键字对于域的效用不受其所在类是还是不是为 final 影响。

出于 final 禁止承袭,所以 final 类中负有的艺术隐式钦点为 final ,因为不可能掩没他们,在 final 类中能够给艺术加多 final 关键字,但这不会扩展任何意义。

final 关键字修饰类时申明类无法继续,那象征类的作用只限于此,同不平日候也分歧意本人和外人对此类进行增添,有的时候那是明智的,但要预言类是何许被复用的日常是非常不便的,特别是对于三个通用的类更是如此,因而在支配将叁个类或措施申明为 final 时,请考虑其效果是或不是只限于此,是还是不是真的未有任何可能被持续或以另外方法被增添。


作品大部分摘抄自《Java 编制程序思想》 第七章 7.8节 final 关键字,加上有的和好的知情,若有不当,接待指正。


final修饰的办法表示此方式已然是“最终的、最后的”含义,亦即此措施不可能被重写(能够重载四个final修饰的措施)。

2. final 参数

利用 final 修饰方法参数意味着无法在格局中期维修改参数的值或援引。这一天性首要用以向无名氏内部类传递参数。

方法中的佚名内部类假诺要一直利用外界方法的参数(或是局地变量),必需将参数或是局部变量表明为 final 。

原因:

  1. 当编写翻译器将 java 文件编写翻译为 class 文件时,无名氏内部类和其所在的类生成的 class 文件并非一份,而是两份(这看似于编写翻译器对内部类的管理),用一份单独的 class 文件保留无名氏内部类,然则无名氏内部类要用到另一份 class 文件中的变量,他俩又是两份独立的 class 文件,此时不得不将应用的变量作为无名氏内部类构造函数的参数字传送到无名氏内部类中(使用佚名内部类时是望眼欲穿增加构造函数的),无名氏内部类会生成同名的域来保存那么些参数。那么些专门的学业是由编写翻译器完成的。

  2. 缘何要用 final 修饰,下面说了编写翻译后是由单独的一份 class 文件保留无名内部类,但是大家在编写佚名内部类的时候程序“看起来”是间接运用了变量的(未有传参,复制援用的历程),假使无名氏内部类修改了变量,这外界的变量也应该相应的做出改换,外界修改了变量那无名内部类中也理应改动,或许说无名氏内部类跟外部的秘籍是密不可分的,他们读取到变量的值应该是大同小异的,就算不须要接纳final 修饰,那外部修改了变量的值,无名氏内部类读取时读取到的值却是伊始时传出的值,那时就不相同样了,这是不相符预期的,大家应用佚名内部类的初衷多数时候尽管能直接选用外界的变量,使内外在某一属性上保持一致,由此使用 final 修饰就能够确定保障独一性,到达同等的职能。

如:

public class Test {
    public void test(final String str, final int id) {
        final String str2 = "";
        new In() {
            @Override
            public void fun() {
//                id  = 2; // 不能修改 编译无法通过
                if (str.contains("a")) {
                    str.replace("a", "b"); // 引用不能修改,但变量本身可以修改,此时内外保持一致
                }
                int len = str2.length();
            }
        };
    }

    interface In {
        void fun();
    }
}

参照小说:java进步篇(十)-----详解无名内部类 ,形参为什么要用final

对于final修饰的部分变量,与未用final修饰的变量同样,都是要求突显开始化。即有的变量都以亟需显示开始化的。

本文由韦德国际1946英国发布于计算机网络,转载请注明出处:Java-final关键字,

关键词: 日记本 伟德国际平台 java - 基础

上一篇:Tools步骤安装虚拟操作系统

下一篇:没有了