关于 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
*/

参考资料

posted @ 2021-03-07 01:11  LianLianzhao  阅读(31)  评论(0)    收藏  举报