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修饰词学习的主要内容,如果未能解决你的问题,请参考以下文章