final关键字
final在Java中是一个保留的关键字,可以声明成员变量、方法、类以及本地变量。一旦你将引用声明作final,你将不能改变这个引用了,编译器会检查代码,如果你试图将变量再次初始化的话,编译器会报编译错误。
一、final关键字的基本用法
- 修饰类
当一个类如果使用final修饰时,那么它将不能再被继承了;而且他的成员方法也将不能再被覆盖重写了。
注意:
1、final的成员变量可以根据需要设为final,但是他的成员方法都会被隐式地指定为final
2、在使用final修饰类的时候,要注意谨慎选择,除非这个类真的在以后不会用来继承或者出于安全的考虑,尽量不要将类设计为final类。
3、对于类、方法来说,abstract和final不能同时使用。
public final class MyClass /*extends Object*/ {
public void method(){
System.out.println("方法执行!");
}
}
- 修饰方法
使用final方法的原因有两个。第一个原因是把方法锁定,以防任何继承类修改它的含义;第二个原因是效率。在早期的Java实现版本中,会将final方法转为内嵌调用。但是如果方法过于庞大,可能看不到内嵌调用带来的任何性能提升。在最近的Java版本中,不需要使用final方法进行这些优化了。
注意:
1、类的private方法会隐式地被指定为final方法
2、当final关键字用来修饰一个方法的时候,这个方法就是最终方法,也就是不能被覆盖重写
- 修饰变量
对于一个final变量,如果是基本数据类型的变量,则其数值一旦在初始化之后便不能更改;如果是引用类型的变量,则在对其初始化之后便不能再让其指向另一个对象。
注意:
1、由于成员变量具有默认值,所以用了final之后必须手动赋值,不会再给默认值了。
2、对于final的成员变量,要么使用直接赋值,要么通过构造方法赋值,二者选其一。
1、必须保证类当中所有重载的构造方法,都最终会对final的成员变量进行赋值。
二、final深入理解
1、被final修饰的引用变量指向的对象内容可变吗?
答:可变。变量被final修饰之后,虽然不能再指向其他对象,但是它指向的对象的内容是可变的。
2、 final和static
运行这段代码:最后j的值都一样,i的值不一样。
public class Test {
public static void main(String[] args) {
MyClass myClass1 = new MyClass();
MyClass myClass2 = new MyClass();
System.out.println(myClass1.i);
System.out.println(myClass1.j);
System.out.println(myClass2.i);
System.out.println(myClass2.j);
}
}
class MyClass {
public final double i = Math.random();
public static double j = Math.random();
}
权限修饰符
Java中有四种权限修饰符,分别是public,protected,default,private