Java8中的final关键字详解

final修饰类

当用final去修饰一个类的时候,表示这个类不能被继承。
将类定义成final后,结果只是禁止被继承。由于禁止了继承,所以一个final类中的所有方法都默认为final。
在自己设计一个类的时候,要想好这个类将来是否会被继承,如果可以被继承,则该类不能使用fianl修饰,在这里呢,一般来说工具类我们往往都会设计成为一个fianl类。在JDK中,String被设计为final类型。

public final class Feige {
    public final void say() {
        System.out.println(666);
    }
}

final修饰方法

final方法主要的作用:防止任何继承类重写此方法。若希望一个方法的行为在继承期间保持不变,不可被重写,就可以采取这种做法。
一个类的private方法会隐式的被指定为final方法。

public  class Feige {
    public final void say() {
        System.out.println(666);
    }
}

final修饰成员变量

final修饰成员变量必须要赋初始值,而且是只能初始化一次。有两种方式:1、直接赋值 2、在构造方法中赋初值。
如果修饰的成员变量是基本类型,则表示这个变量的值不能改变。
如果修饰的成员变量是一个引用类型,则是说这个引用的地址的值不能修改,但是这个引用所指向的对象里面的内容还是可以改变的。

public class Feige {
    private final String name = "feige";
    private final String sex;
    private final static String hobby;

    public Feige() {
        sex = "男";
    }
    static {
        hobby="啪啪啪";
    }
}

深入了解final关键字

public static void main(String[] args)  {
     String a = "hello2";
     final String b = "hello";
     String d = "hello";
     String c = b + 2;
     String e = d + 2;
     System.out.println((a == c));
     System.out.println((a == e));
}

结果:
true
false
为什么第一个比较结果为true,而第二个比较结果为fasle。这里面就是final变量和普通变量的区别了,当final变量是基本数据类型以及String类型时,如果在编译期间能知道它的确切值,则编译器会把它当做编译期常量使用。也就是说在用到该final变量的地方,相当于直接访问的这个常量,不需要在运行时确定。因此在上面的一段代码中,由于变量b被final修饰,因此会被当做编译器常量,所以在使用到b的地方会直接将变量b替换为它的值。而对于变量d的访问却需要在运行时通过链接来进行。想必其中的区别大家应该明白了,不过要注意,只有在编译期间能确切知道final变量值的情况下,编译器才会进行这样的优化。

原文地址:https://www.cnblogs.com/feiqiangsheng/p/11148528.html

时间: 2024-08-27 09:05:02

Java8中的final关键字详解的相关文章

C\C++中的 struct 关键字详解

struct关键字是用来定义一个新的类型,这个新类型里面可以包含各种其他类型,称为结构体. 1. 什么是结构体 结构体(struct)是一种自定义的数据类型,就是把一组需要在一起使用的数据元素组合成一个新的类型.结构体的作用就是封装,以方便地使用这些封装到一起的属性. 新的类型与C++中基本类型int,库类型string一样.C++的关键字struct是从C语言中的struct继承过来的,它们之间有区别与联系. 2. C语言的struct: C语言可以使用结构体struct来存放一组不同类型的数

Java8 中的Optional类详解

在Java8中,引入了一个新的类java.util.Optional .这个类专门用来解决空引用的问题.有了它,对于一个方法的返回值什么的,都不需要再判断是不是null了.同时,这个类和lambda表达式和函数式编程也可以比较好的整合在一起使用. 这里就来看一下这个类的使用. 知道Scala的同学可以类比一下 scala.Option[T] ,或者Haskell的Data.Maybe.都有类似的功能. Optional是一个容器,里面放着我们的返回值(就是真正要用的东西),但是这个真正要用的东西

static与final关键字详解

接口(interface):接口的地位等同于class.接口中的所有方法都是抽象方法.在声明接口中的方法时,可以使用abstract关键字,也可以不使用.通常情况下,都会省略掉abstract关键字. 可以将接口看作特殊的抽象类(抽象类可以有具体方法,也可以有抽象方法,而接口中只能有抽象方法,不能有具体方法). 类可以实现接口.实现用implements表示,代表了某个类实现了某个接口. 一个类实现了某个接口,那么该类必须要实现接口中声明的所有抽象方法.如果该类是抽象类,那么就无需实现接口中的方

Java内部类与final关键字详解

一.内部类的几种创建方法: 1.成员内部类 class Outer{ private int i = 1; class Inner{ public void fun() {System.out.println("Outer I=" + i)} } } 2.方法内部类 class Outer{ public void fun() { final int i = 1; // 被方法内部类访问的局部变量必须被final修饰 class Inner{ // 方法内部类 不能有访问修饰符,比如p

final关键字详解

final变量,如果是基本数据类型,则其数值一旦初始化后就不能被改变.如果是引用类型的变量,则对其初始化后,便不能再指向另一个对象,但是其里面的值是可以改变的.引用变量所指向的对象中的内容是可以改变的. final 变量: final 变量能被显式地初始化并且只能初始化一次.被声明为 final 的对象的引用不能指向不同的对象.但是 final 对象里的数据可以被改变.也就是说 final 对象的引用不能改变,但是里面的值可以改变. final 修饰符通常和 static 修饰符一起使用来创建类

Java中的static关键字详解

1.static关键字主要有2个作用: ①为某特定的数据类型或者对象分配单一的存储空间,而与创建对象的个数无关. ②在不创建对象的情况下可以直接通过类名来直接调用方法或者使用类的属性. 2.static主要有4种使用情况:成员变量(属性),成员方法,代码块,和内部类 3.Java中没有全局变量的概念,但是可以通过static来实现全局变量的效果. Java中提供了2种类型的变量:①用static修饰的静态变量②实例变量 他们的区别是静态变量时属于类的,只要静态变量所在的类被加载,就会被分配空间,

javascript 中的 this 关键字详解

1.javascript 中 什么是 this? this 指的是当前行为执行的主体,或者是当前方法执行的主体 context:是当前行为或者方法执行的环境 实例: xx 去北京饭店吃东西:上下文是“北京饭店”, this 是 xx 2. 那么如何判断一个函数在执行的时候,函数体内的 this 关键字是谁呢?主要有以下几条规律:  1)一个函数体内的 this 关键字和这个函数的在哪里定义,哪里执行都没有关系;   2) 判断一个方法执行的时候,函数的执行主体是谁?主要看方法前面有没有点(.),

js中的this关键字详解[转]

本文实例分析了JavaScript中this的用法.分享给大家供大家参考,具体如下: 一."this"公理 this关键字永远都指向函数(方法)的所有者: ? 1 2 3 4 5 6 7 8 9 function fn1(){   this }; fn1(); //this=>window oDiv.onclick=fn1; //this=>oDiv oDiv.onclick=function(){   this //this=>oDiv   fn1(); //thi

js中的this关键字详解

this是Javascript语言的一个关键字. 它代表函数运行时,自动生成的一个内部对象,只能在函数内部使用.比如, 复制代码 代码如下: function test(){ this.x = 1; } 随着函数使用场合的不同,this的值会发生变化.但是有一个总的原则,那就是this指的是,调用函数的那个对象. 下面分四种情况,详细讨论this的用法. 情况一:纯粹的函数调用 这是函数的最通常用法,属于全局性调用,因此this就代表全局对象Global. 请看下面这段代码,它的运行结果是1.