Java進階教程(一) 關鍵字
synchronized:當它用來修飾一個方法或者一個代碼塊的時候,能夠保證在同一時刻最多隻有一個線程執行該段代碼。
instanceof:在運行時指出對象是否是特定類的一個執行個體。
result = object instanceof class
strictfp:strict float point (精確浮點),保證平台移植之後,浮點運算結果是一致的。
transient:如果用transient聲明一個執行個體變數,當Object Storage Service時,它的值不需要維持。即用transient關鍵字標記的成員變數不參與序列化過程。
assert:斷言可以證明程式的正確性。
assert expression1
assert expression1: expression2
expression1表示一個boolean運算式,expression2表示一個基本類型、運算式或者是一個Object,用於在失敗時輸出錯誤資訊。
在eclipse中,必須開啟相關設定。具體在Window->Preferences->Java->Installed JREs,選擇相關版本,點擊edit,在Default VM arguments裡面輸入-ea。
import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.ObjectInputStream;import java.io.ObjectOutputStream;import java.io.Serializable;public class Demo { public static void main(String[] args) { People people = new People(); try { //序列化 ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("people.dat")); oos.writeObject(people); oos.close(); //還原序列化 ObjectInputStream ois = new ObjectInputStream(new FileInputStream("people.dat")); people = (People) ois.readObject(); ois.close(); } catch (Exception e) { e.printStackTrace(); } //線程 MyRunner boy = new MyRunner(people, "GG", "boy"); MyRunner girl = new MyRunner(people, "MM", "girl"); Thread thread1 = new Thread(boy,"boy"); Thread thread2 = new Thread(girl,"girl"); thread1.start(); thread2.start(); //斷言 boolean isPeople = people instanceof People; assert !isPeople:"it's wrong"; }}class People implements Serializable{ private String name; private String sex; private transient String school = "FJNU"; public synchronized void set(String name,String sex) { this.name = name; this.sex = sex; } public void print(){ System.out.println("name="+name+",sex="+sex+",school="+school); }}class MyRunner implements Runnable{ private People people; private String name; private String sex; public MyRunner(People people,String name,String sex) { this.people = people; this.name = name; this.sex = sex; } @Override public void run() { for(int i=0;i<10;i++){ people.set(name, sex); people.print(); } }} 運行結果如下:
Exception in thread “main” name=MM,sex=girl,school=null
name=MM,sex=girl,school=null
name=MM,sex=girl,school=null
name=GG,sex=boy,school=null
name=MM,sex=girl,school=null
name=MM,sex=girl,school=null
name=MM,sex=girl,school=null
name=MM,sex=girl,school=null
name=MM,sex=girl,school=null
name=MM,sex=girl,school=null
name=MM,sex=girl,school=null
name=MM,sex=girl,school=null
name=GG,sex=boy,school=null
name=GG,sex=boy,school=null
name=GG,sex=boy,school=null
name=GG,sex=boy,school=null
name=GG,sex=boy,school=null
name=GG,sex=boy,school=null
name=GG,sex=boy,school=null
name=GG,sex=boy,school=null
java.lang.AssertionError: it’s wrong at Demo.main(Demo.java:32) 請讀者思考如下問題,歡迎在評論中互動:
如果People的set方法去掉synchronized關鍵字,結果會怎樣。
為什麼school是null。