インスタンスからJavaの静的メソッド/変数を参照する
質問
Javaでインスタンスから静的メソッドと静的メンバーにアクセスできる理由を誰かが説明できますか?悪い例として、RedShapeというクラスがあり、「red」を返すgetColor()という静的メソッドがある場合、なぜjavaではRedShapeのインスタンスから静的メソッドを呼び出すことができますか?私には、これはオブジェクト指向言語設計の中核概念のいくつかに違反しているようです。少なくとも、コンパイラの警告が表示されるはずです。
事前に感謝します。
編集:
特に、次のようなものがあるかどうかを尋ねています
RedShape test = new RedShape();
test.getColor();
getColorはRedShapeクラスの静的メソッドです。これは許可されているとは意味をなさず、javacを介してコマンドラインにコンパイラの警告を表示しません。 「強くお勧めできません」と思いますが、「C ++で許可されているため」の外で許可されている理由の背後に技術的または合理的な理由があるかどうかに興味がありました。
解決
実際にこれを実行できる理由はありません。
私の唯一の推測は、静的メソッドをオーバーライドできるということでしたが、できない。
次のシナリオを試す場合:
Bananaには 'test'という静的メソッドがあります(これは 'banana'を出力します) Appleはバナナを拡張し、「オーバーライド」します。 '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
非常に効果的に、かなり役に立たない。
他のヒント
インスタンスから 静的メソッドを呼び出しても何も問題はありません。それのどこが悪いんだい?特に、クラスのロジック内では便利ですが、実際にはインスタンス自体を操作する必要のないメソッドが非常に多くあります。
インスタンス参照を介して 静的メソッドを呼び出す do オブジェクト。古典的な例:
Thread thread = new Thread(...);
thread.sleep(5000); // Doesn't do what it looks like
これには、一部のIDEでコンパイラ警告が付いています-確かにEclipseでは、有効にすると仮定します。 (Java /コンパイラ/エラーと警告/コードスタイル/静的メンバーへの非静的アクセス。)個人的には、Javaの設計におけるそれの間違いだと思います。 (これは、C#がコピーを避けることができた間違いの1つです。)
静的メソッドへのアクセスにより、同じクラスのインスタンス間で値を共有したり、クラスインスタンスを作成しなくても値を取得したりできます。
便利でオブジェクト指向言語の違反がない場合があります。
元の設計者がC ++から機能を移植していたためだと思います。20/ 20後知恵がヒットする頃には、後方互換性の問題でした。
それ、または、クラス内でメソッドを呼び出すと、すべてを this。
でプレフィックスする必要はありませんが、コンパイラは静的メソッドを含めてそれ(または同等のもの)を挿入します。インスタンスから静的メソッドを呼び出せなかった場合は、フロントで this。
をタックすることが問題になる可能性があります(または、コーダーが使用したいときにいつでも静的メソッドのフロントでクラス名をタックする必要があります)実際のインスタンス内)。
とにかく、初期の言語開発者の一人に答えさせない限り、答えは投機的です。
public class MyClass {
public static String myString;
}
public class AnotherClass {
public void doSomething() {
doAnotherThing();
}
public static doAnotherThing() {
MyClass.myString = "something";
}
ここでは、非静的メソッドから静的メソッドを呼び出すことにより、非静的メソッドから静的変数に(間接的に)アクセスしています。