例子:person物件,age和name都不能再變
/**
* 不可變的物件,演示其他類無法修改這個物件,public也不行
*/public class person
}
具有不變性的物件一定是執行緒安全的,我們不需要對其採取任何額外的安全措施,也能保證執行緒安全
早期現在
final修飾變數final修飾:3種變數
final修飾變數:賦值時機
賦值時機finalinstancevariable(類中的final屬性)
/**
* 演示final變數
*/public class finalvariabledemo
//第三就是在類的初始**塊中賦值(不常用)
//}
finalstaticvariable(類中的static final屬性)
public class finalvariabledemo
}
final local variable(方法中的final變數)
public class finalvariabledemo
}
為什麼要規定賦值時機?
public class finalvariabledemo
}
final修飾方法
public class finalmethoddemo
}
public class finalmethoddemo
public final void eat()
public static void sleep()
}class subclass extends finalmethoddemo
//public final void eat()
//public void eat()
//可以寫乙個同名的方法:這一點和final方法不一樣
public static void sleep()
//public static void main(string args)
}
final修飾類
不變性並不意味著,簡單地用final修飾就是不可變
如何利用final實現物件不可變總結:滿足以下條件時,物件才是不可變的
public class person
}class testfinal
/**
* 乙個屬性是物件,但是整體不可變,其他類無法修改set裡面的資料
*/public class immutabledemo
public boolean isstudent(string name)
}
/**
* 演示棧封閉的兩種情況,基本變數和物件 先演示執行緒爭搶帶來錯誤結果,然後把變數放到方法內,情況就變了
*/public class stackconfinement implements runnable
//}system.out.println("棧內保護的數字是執行緒安全的:" + nevergoout);
}@override
public void run()
inthread();
}public static void main(string args) throws interruptedexception
}
public class finalstringdemo1
}
public class finalstringdemo2
public static void main(string args)
}
final關鍵字與不變性
類中的static final屬性則有兩種賦值時機,除了在宣告變數的等號右邊直接賦值,還可以用static初始 塊賦值,而不能用普通的初始化 塊賦值 在方法中的final變數,由於方法中並沒有建構函式,也沒有初始化 塊,所以不規定賦值時機,只要求在變數使用前必須賦值 描述 演示棧封閉的兩種情況,基本...
static關鍵字和final關鍵字
static記住幾點 1.優先順序高,載入優先物件例項化 2.在記憶體中只分配一次 3.屬於類本身,所有例項共享,一處變,處處變 4.1 static不能訪問沒有static修飾的方法 因為不認識,物件例項後才能在外部使用方法 2 可以訪問static塊 3 未加static的方法可以訪問stati...
abstract關鍵字和final關鍵字
abstract類和abstract方法 用關鍵字abstract修飾的類 方法 稱為abstract類 方法 抽象類,抽象方法。對於abstract方法,沒有方法體,且以 結尾,且不允許使用final和abstract同時修飾乙個類或者方法,因為被abstract修飾的話,就無法被繼承 abstr...