java中final修饰词学习

Posted 天堂1223

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java中final修饰词学习相关的知识,希望对你有一定的参考价值。

在jls15中,我们通过搜索final关键字,可以搜索到关键字final的用处。下面我们对final进行学习。

一、final修饰变量

一个变量可以被声明为final。一个final变量可能只能被赋值一次。除非在一次赋值之前,该final变量必须是明确未赋值的,否则其如果被赋值,则将会抛出编译错误。

一旦一个final变量已经被赋值了,他就会一直保持相同的值。如果一个变量是指向一个对象的引用,对象的状态可能会被对象的操作所改变,但是该变量会一直只想相同的对象。这个也同样应用到数组,因为数组也是对象;如果一个final变量指向一个数组的引用,通过对数组的操作可能会更修数组的组件内容,但是该变量还是会一直指向该数组。
例如:

public class Main 

    private String name;
    private int age;

    public Main(String name, int age) 
        this.name = name;
        this.age = age;
    

    public String getName() 
        return name;
    

    public void setName(String name) 
        this.name = name;
    

    public int getAge() 
        return age;
    

    public void setAge(int age) 
        this.age = age;
    

    public static void main(String[] args) 
       final Main main1 = new Main("laoc",28);
       System.out.println(main1);

       main1.setName("lac1123");
       main1.setAge(100);
       System.out.println(main1);

       Main main2 = new Main("wang",23);
       // 这样的赋值会被报错,因为main1已经被赋值了,他会一直指向对象main1
       // main1 = main2;

    

// 

最后的输出结果:

site.laoc.Main@1b6d3586
site.laoc.Main@1b6d3586

mm
通过对上次两个打印main1的地址,最终的结果是一样的,所以在对对象操作的时候,其对象状态可能会改变,但是其对象是不变的;我们尝试修改main1的对象指向,在编译过程就会报错。

一个空的final是缺乏初始化的final变量声明。一个常量是由常量表达式初始化的基础类型或String类型的final变量。一个变量是不是常量可能会影响类初始化,二进制兼容性,可到达性和明确分配。

  • 有三种变量被隐式声明为final:接口中的字段,被声明为try资源语句的本地变量和一个多catch从句的异常参数。一个联合catch的一个异常参数不会被明确隐式声明为final,但是可能实际上是final的.

我们具体看一下实例:

  • 接口中的变量被默认隐式声明为final
public interface TestInterface 
    public int test = 10;

    public void print();


public class Test implements TestInterface

    @Override
    public void print() 
        test = 11;  // 报错,不能赋值为final变量test
    

  • 被声明为try资源语句的本地变量
 public void print() 
     try(InputStream in = new FileInputStream("/test.txt"))
         in = new FileInputStream("m.txt");  // // 报错,不能赋值为final变量in
     catch(Exception e)
         e.printStackTrace();
     
 

这里是java1.7增加的try-with-resource语法糖,在这里,引入的流默认被隐式声明为final变量,所以不能修改其值。

  • 一个多catch从句的异常参数

该类型该没想到合适的例程,如果大家有好的想法,可以@老陈1223(laochen1223)

如果一个变量确实是final,向变量中添加final声明将不会导致编译错误。相反的,如果在一个有效程序中一个被声明为final的本地变量或参数,如果final描述符被移除,这个变量将会变为有效的最终变量。

二、final类

如果一个类的定义是完整的,并且并不需要子类,则该类可以被声明为final类。

这里的Dog继承自final类Animal,在这里报错,说不能继承自final类Animal。这个错误是一个编译错误。这就意味着final类不能有任何子类。

如果一个类同时被声明为final和 abstract,将会抛出编译时错误,因为这样一个类的实现不可能是完全的。

因为一个final类不可能有任何子类,所以final类的所有的方法都不可能被重写。

三、final方法

一个方法可以被声明为final以防止子类重写或隐藏他。重写或隐藏一个final方法将会抛出一个编译错误。
一个private方法和在一个final类中的所有声明的方法和把他们声明为 final的状态是一样的,因为他们都不可能被重写。

以上是关于java中final修饰词学习的主要内容,如果未能解决你的问题,请参考以下文章

java中final修饰词学习

定语从句

定语从句语法讲解

[面试题]java中final finally finalized 的差别是什么?

英语句式参考纯享版 - 定语从句

英语句式参考纯享版 - 定语从句