final可以修飾類,方法,變量。
一、final和類
- final修飾類不可以被繼承。
- final 類的 方法 自動地聲明為 final,但是實例變量并不是 final。
二、final和屬性
- final修飾的變量稱為常量,這些變量只能賦值一次,final 的變量不能被修改
- final修飾的引用類型變量,表示該變量的引用不能變,而不是該變量的值不能變;
- 內(nèi)部類在局部時,只可以訪問被final修飾的局部變量。
證明1: final修飾的變量稱為常量,這些變量只能賦值一次,final 的變量不能被修改
public class FinalTry {
final int finaVar = 18;
int norVar = 22;
void showVar(){
System.out.println("finaVar 1: "+ finaVar);
finaVar = 19;
norVar = 23;
}
}
image.png
.
.
證明2: final修飾的引用類型變量,表示該變量的引用不能變,而不是該變量的值不能變;
Java中的String類是聲明為final的,一旦建立String對象之后它的值的內(nèi)容是無法修改的,任何看上去是對String對象的值的修改都只是改變String對象的引用,但是StringBuffer類彌補了String類的不足,StringBuffer類的內(nèi)容可以修改。
StringBuilder 在api的定義是:
public final class StringBuilder
extends AbstractStringBuilder
implements java.io.Serializable, CharSequence
也是final,
區(qū)別是:
String是不可變類,一旦String對象被創(chuàng)建,包含在對象中的字符序列是不可變的,直到對象被銷毀
StringBuffer 與 StringBuilder對象則是可變的,不用每次新建對象,效率高!
public class FinalTry {
public static void main(String[] args) {
final StringBuilder sb = new StringBuilder("haha");
StringBuilder sbChange = new StringBuilder("hehe");
//同一對象的hashCode值相同
System.out.println("sb中的內(nèi)容是:"+sb);
System.out.println(sb+"的哈希編碼是:"+sb.hashCode());
sb.append("值改變了");
System.out.println("sb中的內(nèi)容是:"+sb);
System.out.println(sb+"的哈希編碼是:"+sb.hashCode());
// sb = sbChange; 這句代碼會報錯,因為sb是final的,如果把sb的final去掉那么就不報錯
System.out.println("-----------------哈希值-------------------");
FinalTry test = new FinalTry();
System.out.println(test.hashCode());
System.out.println(Integer.toHexString(test.hashCode()));
System.out.println(test.toString());
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.
}
}
輸出:
sb中的內(nèi)容是:haha
haha的哈希編碼是:2018699554
sb中的內(nèi)容是:haha值改變了
haha值改變了的哈希編碼是:2018699554
-----------------哈希值-------------------
1311053135
4e25154f
FinalTry@4e25154f
class FinalTry@4e25154f
FinalTry@4e25154f
二、final和方法
final修飾的方法不可以被覆寫