計時器Timer工具類使用注意事項
- 調用schedule()方法時需要考慮線程任務調度,當喚醒TimerTask時,由於執行的確切時機取決於JVM調度策略和當前還有多 少線程等待CPU處理,因此不能保證指定時間內執行,如果一個時間任務執行的時間比較長,大量線程等待執行,那麼執行其他任務會受到影響,是固定延遲調度,執行任務中的每一個延遲會傳播到後續的任務執行。
調用scheduleAsFixedRate()是理論計算出下次需要調度的時間用以排序,是用固定比率調度,使用三個參數來指定task每隔x秒執行一次。
- schedule(TimerTask task, long delay, long period)
- schedule(TimerTask task, Date time, long period)
- scheduleAtFixedRate(TimerTask task, long delay, long period)
scheduleAtFixedRate(TimerTask task, Date firstTime, long period)
使用兩個參數可以指定task多少秒後執行任務一次(時間爲long類型)或是指定當前任務的執行時間(時間爲Date類型)
- 注意:利用timer執行任務結束後,要調用timer.cancle()方法,避免下次重新啓動timer時出現計時不準確的錯誤。
Java中= 與 == 的區別
- = 是賦值運算符,將常量、變量或表達式的值賦給某一個變量。
- == 是比較運算符,返回的值爲ture或false,常見有 == >= <= > < !=
Java局部內部類和匿名內部類的特點和作用
成員內部類:即作爲一個外部類的成員所在,與外部類的屬性方法並列,內部類中不可定義靜態變量,可以訪問外部類所有成員。
- 外部類的變量如果和內部類的變量沒有同名的,則可以直接使用變量名訪問外部類變量
- 在內部類中訪問自己的內部類中的變量直接使用變量名
- 也可以使用“th is.變量名”來訪問內部類變量
- 訪問外部類與內部類同名的實例變量可用“外部類名.this.變量名”
- 外部類可以訪問內部類中的方法
優點:內部類作爲外部類的成員,可以訪問外部類私有的屬性和方法
局部內部類:即方法中定義內部類,與局部變量相似,在局部內部類前不加修飾符public和private,範圍是定義的代碼塊。
- 如果內部類沒有與外部類同名的變量,在內部類中可以直接訪問外部類的實例變量
- 可以訪問外部類的局部變量(即方法內的變量),但是變量必須是final的
- 用”this.變量名” 訪問的也是內部類變量
- 用外部”外部類類名.this.變量名” 訪問的是外部類變量
- 訪問局部內部類必須先有外部類對象
注意:局部內部類中不可定義靜態變量,可以訪問外部類的局部變量(即方法內的變量),但是變量必須是final的。
靜態內部類:即用static修飾的成員內部類
- 靜態內部類只能訪問外部類的靜態成員包括靜態變量和靜態方法。
- 靜態內部類不能訪問外部類的非靜態成員包括非靜態變量和非靜態方法。
- 外部類訪問內部類的靜態成員:內部類.靜態成員。
- 外部類訪問內部類的非靜態成員:實例化內部類即可。
注意:靜態內部類中可以定義靜態成員或非靜態成員
Java 程序是如何運行的
- 用戶USER - - 高級語言程序 - - 編譯器 - - 操作系統 - - 硬件
- Java 程序 - - 編譯器 - - 與平臺無關的字節碼程序 - - Java 虛擬機 - - 特定機器的語言程序
- 用戶輸入 int i 通過編譯器編譯成可執行程序,請求操作系統,操作系統在硬件上分配一塊內存,內存當做變量 i 來使用。
Java 運算符
- ‘a’ + 1 輸出結果爲 98
- “” + ‘a’ + 1 輸出結果爲 a1
- / 除法運算符,如果兩個對象有一個或兩個爲浮點型數據,則商也是浮點型
- % 取餘運算符,所得餘數的正負只和被除數相同 -5%3 == -2
Java 創建對象內存分配
A a = new A();
// 相當於 c 語言動態分配內存 A *a = (A *)malloc(sizeof(A))
// new A();
在堆中動態分配一塊區域,被當做了 A 對象
// a 本身的內存是在棧中分配的
// 堆中內存的地址付給了 a
// a 指向堆中的內存, a 代表了堆中的內存
//a.i 代表 a 這個靜態指針變量所指向的動態內存中的 A 對象 i 這個成員
程序執行過程 硬盤(程序) - - 內存(代碼) - - 執行過程進行內存管理
1.new 出來的東西放在 heap(堆)中
2.局部變量放在 stack(棧)中
3.靜態變量,字符串常量放在 data segment 中
4.代碼存放在 code segment 中
Java 變量
- 成員變量:在類範圍內定義的變量,對象被創建時自動進行初始化賦值
- 局部變量:在一個方法內定義的變量,不會自動進行初始化賦值,要進行初始化
- 靜態變量:屬於類本身,沒有對象也可直接訪問,存儲在 data segment 中
this 關鍵字
- n 個對象屬性有不同的空間,但是都共用同一個方法,分辨這個方法正在處理哪個對象,方法內部有一個隱藏的 this 指針,指向當前調用方法的對象。
Java 繼承
- 子類內部可以訪問父類的非私有的成員,私有成員無法被子類方法訪問。
- 子類對象只能訪問從父類繼承過來的非私有成員。
- 總結:私有不能被繼承
super 關鍵字
- 每個子類的構造方法,都隱含地調用 super() ,如果父類沒有這種形式的構造方法,那麼編譯時會報錯。
- 如果顯示的寫出 super(),則必須保證該語句是第一條語句。
- super() 如果不寫,則編譯器會自動添加,如果父類沒有無參的構造方法,那麼會出錯。
- 調用父類的構造方法語句必須藉助於 super,不能通過父類的類名調用。
Java 多態
- 子類對象可以直接賦給父類引用,但父類對象任何情況下都不可以直接賦給子類引用。
- 通過父類引用只能訪問子類對象從父類繼承過來的成員。
- 父類引用永遠不可能直接賦給子類引用,只有在父類引用本身指向的就是一個子類對象時,纔可以把父類引用強制轉化爲子類引用。
Java 包
- 如果把類文件放在了包中,那麼類的真正名字將是包名和類名的組合。
- 在同一個包中只有私有的不能被另一個類訪問,也只有私有的不能被繼承。
- 在不同包沒有任何關係的兩個類,只有 public 類的 public 的成員纔可以被另一個類訪問。
- 不同包中有繼承關係的兩個類,只有 public 類的 public 和 protected 成員可以被另一個包中的子類在內部使用,但在子類的外部,通過子類對象名只能訪問父類的 public 成員。
Java 異常處理
- 頂級父類 Throwable 有兩個子類,Error 和 Exception ,Exception 下又分 RuntimeException。
- Error 是系統錯誤,程序員無法處理這些異常。
- RuntimeException 的子類異常,是你可以處理又可以不處理的異常。
- 凡是繼承自 Exception 但又不是 RuntimeException 子類的異常我們都必須的捕捉並處理。
Java Object 類的 equals 方法
- 用來判斷調用 equals 的對象和形參 object 所引用的對象是否是同一對象,所謂同一對象是指內存中同一塊存儲單元,即便是內容完全相等的兩塊不同的內存對象,也會返回 false。