4

Javaでインスタンスから静的メソッドとメンバーにアクセスできる理由を誰かに説明してもらえますか?悪い例ですが、RedShapeというクラスがあり、「red」を返すgetColor()という静的メソッドがある場合、JavaでRedShapeのインスタンスから静的メソッドを呼び出せるのはなぜですか?私には、これはオブジェクト指向言語設計のコアコンセプトのいくつかに違反しているように見えます。少なくとも、コンパイラの警告が表示されるはずです。

前もって感謝します。

編集:

特に、私はあなたが次のようなものを持っているときについて尋ねています

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

ここで、getColorはRedShapeクラスの静的メソッドです。これは許可されていることには意味がなく、javacを介してコマンドラインでコンパイラに警告を表示しません。「強くお勧めできません」と思いますが、「C ++で許可されているため」以外で許可されている理由の背後に、技術的または合理的な理由があるかどうかに興味がありました。

4

5 に答える 5

9

インスタンスから静的メソッドを呼び出すことに何の問題もありません。それのどこが悪いんだい?特に、クラスのロジック内で役立つメソッドがありますが、実際にはインスタンス自体を操作する必要はありません。

インスタンス参照を介して静的メソッドを呼び出すことに反対します。古典的な例:

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

これには、一部のIDEでコンパイラ警告が付属しています-確かにEclipseでは、オンにすると仮定します。(Java /コンパイラ/エラーと警告/コードスタイル/静的メンバーへの非静的アクセス。)個人的には Javaの設計に誤りがあると思います。(これは、C#がコピーを回避することに成功した間違いの1つです。)

于 2009-09-17T16:16:02.300 に答える
3

あなたが実際にこれを行うことができる理由は本当にありません。

私の唯一の推測は、静的メソッドをオーバーライドできるということでしたが、オーバーライドすることはできません

次のシナリオを試す場合:

バナナには「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

とても効果的に、それはかなり役に立たない。

于 2009-09-17T16:26:47.653 に答える
0

静的メソッドにアクセスすると、同じクラスのインスタンス間で値を共有したり、クラスインスタンスを作成しなくても値を取得したりできます。

便利でオブジェクト指向言語違反ではない場合があります。

于 2009-09-17T16:16:08.837 に答える
0

元の設計者がC++から機能を移植していたためだと思います。そして、20/20の後知恵がヒットするまでに、下位互換性の問題でした。

this.それは、またはクラス内でメソッドを呼び出すときに、静的メソッドを含め、コンパイラがすべてにプレフィックスを付ける必要がない場合でも、それ(または同等のもの)を挿入するためです。インスタンスから静的メソッドを呼び出せない場合はthis.、フロントでのタックが問題になる可能性があります(または、実際のインスタンス内で静的メソッドを使用する場合は常に、静的メソッドのフロントでクラス名をタックするようにコーダーに強制します)。

とにかく、初期の言語開発者の1人に答えさせない限り、答えは推測に基づくものです。

于 2009-09-17T19:23:54.083 に答える
0
public class MyClass {
    public static String myString;
}


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

ここでは、非静的メソッドから静的メソッドを呼び出すことにより、非静的メソッドから静的変数に(間接的に)アクセスしています。

于 2012-10-22T09:48:14.553 に答える