“Java中的靜态類
有什麼像static class在Java中嗎?
這樣的課是什麼意思。靜态類的所有方法都需要static嗎?
是否需要反過來,如果一個類包含所有靜态方法,那麼該類也應該是靜态的嗎?
靜态類有什麼用處?
高分回答:
很多的知識點,真的需要寫出來才會掌握!!! \color{purple}很多的知識點,真的需要寫出來才會掌握!!!{~}很多的知識點,真的需要寫出來才會掌握!!!
Java具有靜态嵌套類,但聽起來您正在尋找頂級靜态類。Java無法将頂級類設為靜态,但您可以像這樣模拟靜态類:
聲明您的class final-阻止擴充class,因為擴充靜态class沒有意義
建立構造函數private-防止通過用戶端代碼執行個體化,因為執行個體化靜态類沒有任何意義
建立類的所有成員和函數static-由于無法執行個體化該類,是以無法調用任何執行個體方法或無法通路執行個體字段
請注意,編譯器不會阻止您聲明執行個體(非靜态)成員。僅當您嘗試調用執行個體成員時才會顯示該問題
每個建議的簡單示例如下:
public class TestMyStaticClass {
public static void main(String []args){
MyStaticClass.setMyStaticMember(5);
System.out.println("Static value: " + MyStaticClass.getMyStaticMember());
System.out.println("Value squared: " + MyStaticClass.squareMyStaticMember());
// MyStaticClass x = new MyStaticClass(); // results in compile time error
}
}
// A top-level Java class mimicking static class behavior
public final class MyStaticClass {
private MyStaticClass () { // private constructor
myStaticMember = 1;
}
private static int myStaticMember;
public static void setMyStaticMember(int val) {
myStaticMember = val;
}
public static int getMyStaticMember() {
return myStaticMember;
}
public static int squareMyStaticMember() {
return myStaticMember * myStaticMember;
}
}
複制代碼
靜态類有什麼用?靜态類的一個好用法是定義一次性的,實用程式和/或庫類,在這些類中,執行個體化是沒有意義的。一個很好的例子是Math類,它包含一些數學常數,例如PI和E,并且僅提供數學計算。在這種情況下,需要執行個體化将是不必要且令人困惑的。請參閱Math類和源代碼。請注意,它是final并且其所有成員均為static。如果Java允許聲明頂級類,static則Math類确實是靜态的。
好吧,Java有“靜态嵌套類”,但是如果您來自哪裡,它們與C#的靜态類根本不一樣。靜态嵌套類隻是一個沒有隐式引用外部類執行個體的類。
靜态嵌套類可以具有執行個體方法和靜态方法。
Java中沒有頂級靜态類。
文章翻譯自 yl2gl72eozkinivz3vc6swkesy-ac4c6men2g7xr2a-translate.translate.goog/questions/7…
*作者建議:的确大多數的靜态類都是一些工具類,當然之前也寫過靜态内部類實作線程安全的單例模式,附帶jdk源碼中url模闆類實作的單例模式--> Java内部類和靜态嵌套類?
除了上面講到的靜态内部類,再講一個大家都熟悉的ThreadPoolExecutor
public class ThreadPoolExecutor extends AbstractExecutorService
複制代碼
它裡面有這樣一個内部類Worker繼承了AQS
// 主要的屬性就是任務firstTask和線程thread
private final class Worker
extends AbstractQueuedSynchronizer
implements Runnable
複制代碼
它裡面還有靜态内部類 - 拒絕政策
public static class CallerRunsPolicy implements RejectedExecutionHandler 給調用者
public static class AbortPolicy implements RejectedExecutionHandler 異常
public static class DiscardPolicy implements RejectedExecutionHandler 丢棄
public static class DiscardOldestPolicy implements RejectedExecutionHandler 丢棄最舊的
複制代碼
ThreadPoolExecutor本身就繼承了一個抽象執行器(主要方法:添加任務和送出任務),如果想要避免線程的争搶需要用到AQS,例如在執行任務時:
final void runWorker(Worker w) {
Thread wt = Thread.currentThread();
Runnable task = w.firstTask;
w.firstTask = null;
w.unlock(); // 以獨占的方式釋放資源
複制代碼
unlock
public void unlock() { release(1); }
複制代碼
這個AQS類的公共方法release
public final boolean release(int arg) {
if (tryRelease(arg)) {
Node h = head;
if (h != null && h.waitStatus != 0)
unparkSuccessor(h);
return true;
}
return false;
}
複制代碼
用到線程池才會去加載,設定自動回收,關于線程池的調優和原理,請看我的這篇文章:
zhuanlan.zhihu.com/p/147583619
歡迎關注我的專欄StackOverFlow,我會篩選優質的問答,面試常考!!! \color{red}歡迎關注我的專欄StackOverFlow,我會篩選優質的問答,面試常考!!!{~}歡迎關注我的專欄StackOverFlow,我會篩選優質的問答,面試常考!!!
有最新、優雅的實作方式,我也會在文末寫出我對本問答的見解 \color{red}有最新、優雅的實作方式,我也會在文末寫出我對本問答的見解{~}有最新、優雅的實作方式,我也會在文末寫出我對本問答的見解
真心感謝帥逼靓女們能看到這裡,如果這個文章寫得還不錯,覺得有點東西的話