关于 final 的一些细节
final 的几种用法
final 关键字可以用来修饰 类,方法,和变量(成员变量,局部变量)
修饰类
- 当
final修饰类的时候,说明这个类不可以被别人继承! - 而且
final类中修饰的成员方法都会被指定为final方法
修饰方法
- 当一个方法被
final修饰后,就代表该方法无法被重写,遇到那种需要在子类中禁止被使用的方法可以用final修饰; - 但是当父类中把被
final修饰的方法加上private修饰,那么子类可以写一个相同名字的方法。(类的private方法会隐式地被指定为final方法。)
修饰变量
- 如果修饰的是基本数据类型的变量,那么这个变量不可以被改变;
- 如果修饰的是一个引用变量,那么该变量存的是一个地址,你不可以重新
new出来一个地址将变量改变,但是可以修改该内存地址所指向的那个对象的值
举例
/**
* 验证final修饰的变量是引用不能变,还是引用的对象不能变
* StringBuilder 线程不安全 但速度快
* 引用初始化以后不能被改变 --- 不是指变量的值不可变,而是指向的变量地址不可变
* @author Tomato
*
*/
public class TestFinal {
public static void main(String[] args) {
final StringBuilder sb = new StringBuilder("haha");
//同一对象的hashCode值相同
System.out.println("sb中的内容是:"+sb);
System.out.println(sb+"的哈希编码是:"+sb.hashCode());
sb.append("我变了");
System.out.println("sb中的内容是:"+sb);
System.out.println(sb+"的哈希编码是:"+sb.hashCode());
System.out.println("-----------------哈希值-------------------");
TestFinal test = new TestFinal();
System.out.println(test.hashCode());
System.out.println(Integer.toHexString(test.hashCode()));
System.out.println(test.getClass()+"@"+Integer.toHexString(test.hashCode()));
System.out.println(test.getClass().getName()+"@"+Integer.toHexString(test.hashCode()));
//在API中这么定义toString()等同于 getClass().getName() + '@' + Integer.toHexString(hashCode())
//返回值是 a string representation of the object.
System.out.println(test.toString());
}
}
/*
代码结果是:
sb中的内容是:haha
haha的哈希编码是:1928052572
sb中的内容是:haha我变了
haha我变了的哈希编码是:1928052572
-----------------哈希值-------------------
1398828021
53606bf5
class TestFinal@53606bf5
TestFinal@53606bf5
TestFinal@53606bf5
*/

浙公网安备 33010602011771号