簡體   English   中英

使用Java中的對象調用靜態方法會出現什么問題?

[英]What could go wrong with calling a static method with an object in Java?

如果我有以下內容:

class A {
  public A() { }
  public static void foo() { System.out.println("foo() called"); }
}

public class Main {
  public static void main(String [] args) {
    A a = new A();
    a.foo(); // <-- static call using an instance.
    A.foo(); // <-- static call using class
  }
}

使用實例調用foo()可能會出現任何問題嗎? JVM是否將第一次調用foo()完全視為靜態方法,還是存在一些技術細微之處?

通過從實例調用靜態方法很容易引入細微的邏輯錯誤。 例如,這不符合您的想法:

Thread t = new Thread(...);
t.sleep(1000);

sleep是一個靜態方法,它暫停當前正在執行的線程,而不是線程實例。

這兩個電話是一樣的。 想到的問題是當重寫A類時,不能直接覆蓋foo()。

它只是被認為是糟糕的形式/做法。 避免這樣做。

一個很好的理由是,您可能會混淆可能需要閱讀或更新代碼的其他人。 它真的“看起來”像實例化對象應該參與方法調用,而實際上它不是(實際上它可以為null)。 這是不必要的混淆。

不是100%肯定,但如果您的實例為null,則可能會遇到空指針異常。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM