簡體   English   中英

從實例引用Java中的靜態方法/變量

[英]Reference Static Methods/Variables in Java from an Instance

任何人都可以向我解釋為什么java允許您從實例訪問靜態方法和成員? 一個不好的例子,如果我有一個名為RedShape的類並且它有一個名為getColor()的靜態方法返回“red”,為什么java允許你從RedShape實例調用靜態方法? 對我而言,這似乎違反了OO語言設計的一些核心概念。 至少,它應該帶有編譯器警告。

提前致謝。

編輯:

特別是,我問你什么時候有類似的東西

RedShape test = new RedShape();
test.getColor();

其中getColor是RedShape類的靜態方法。 這沒有任何意義,它是允許的,並沒有通過javac在命令行上給出編譯器警告。 我看到它“強烈氣餒”,但很奇怪是否有一個技術或合理的理由背后為什么它被允許在“因為C ++允許它”之外。

實例調用靜態方法我沒有看到任何問題。 這有什么問題? 特別是,通常有一些方法在類的邏輯中很有用,但實際上並不需要操作實例本身。

反對通過調用實例引用一個靜態方法。 經典例子:

Thread thread = new Thread(...);
thread.sleep(5000); // Doesn't do what it looks like

這在一些IDE中帶有編譯器警告 - 當然在Eclipse中,假設你打開它。 (Java /編譯器/錯誤和警告/代碼樣式/非靜態訪問靜態成員。)我個人認為在Java中的設計錯誤。 (這是C#設法避免復制的錯誤之一。)

你真的沒有理由這么做。

我唯一的猜測是它會允許你覆蓋靜態方法,但你不能

如果您嘗試以下方案:

Banana有一個名為'test'的靜態方法(打印'banana')Apple擴展Banana並“覆蓋”名為'test'的靜態方法(打印'apple')

你做這樣的事情:

public static void main(String[] args) {
    Apple apple = new Apple();
    Banana banana = new Banana();
    Banana base = new Apple();

    apple.test();
    banana.test();
    base.test();
}

結果輸出是:

apple
banana
banana

如此有效,它毫無用處。

public class MyClass {
    public static String myString;
}


public class AnotherClass {
   public void doSomething() {
       doAnotherThing();
   }
   public static doAnotherThing() {
       MyClass.myString = "something";
   }

這里我們通過從非靜態方法調用靜態方法從非靜態方法(間接)訪問靜態變量。

對靜態方法的訪問允許您在同一個類的實例之間共享值,甚至可以在不需要創建類實例的情況下獲取值。

有些情況下它很方便,沒有OO語言違規。

我打賭這是因為最初的設計師正在從C ++移植功能,到20/20后見之明時,這是一個向后兼容性問題。

那,或者因為當你在一個類中調用一個方法時,即使你不必用this.來為所有內容加前綴this. 編譯器插入它(或等效的)包括靜態方法。 如果無法從實例調用靜態方法,那么解決this. 在前面可能是一個問題(或者只要他們想在實際實例中使用它們,就會迫使編碼人員在靜態方法的前面添加類名)。

無論如何,除非我們讓一位早期語言開發人員回答,否則答案是推測性的。

暫無
暫無

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

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