[英]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.