2

私は現在、独学で Java を学んでいます。答えは単純なものだと確信していますが、この質問にしばらく頭を悩ませていました。super.method(... を参照せずにサブクラスでメソッドを呼び出すことができるように、特定のクラスを拡張することによって取得される隠しメソッドがあるかどうか疑問に思っていました。たとえば、この ButtonPanel クラスを見てください。

class ButtonPanels extends JPanel {
    /**
     * 
     */
    private static final long serialVersionUID = 1L;

    public ButtonPanels(){
        JButton yellow = new JButton("Yellow");
        JButton blue = new JButton("Blue");
        JButton red = new JButton("Red");

        add(yellow);
        add(blue);
        add(red);
    }
}

ここの「追加」メソッドは...どこから来たのですか? super.add を書くと完全にうまくいくように見えますが、これは私を混乱させます。スーパークラスから呼び出すすべてのメソッドの前に super を書く必要はありませんか?

4

4 に答える 4

5

これらは「隠された」メソッドではありません。スーパークラスからメソッドを呼び出す場合はオプションです (独自のsuper.クラスでオーバーライドしていない限り、super.独自の実装と区別する必要があります)。

ドキュメントでJPanelは、これらすべてのメソッドが「メソッドの概要」ヘッダーの下、特に「クラス java.awt.Container から継承されたメソッド」セクションにリストされています (複数のオーバーロードがあり、複数add回言及されているためです)。

于 2012-09-27T03:53:37.227 に答える
1

書く必要はありませんsuper。メソッド定義がこのクラスで使用できない場合、jvm はスーパークラスでメソッドが使用可能かどうかをチェックします。

supersuperオーバーライドされたメソッドがあり、クラスの実装ではなくクラスの実装を呼び出したい場合sub(オーバーライドされた実装)は必須です。

于 2012-09-27T03:53:49.630 に答える
0

これはポリモーフィズムの影響です。ButtonPanels クラスは、ButtonsPanel と JPanel の両方です。そのため、ButtonsPanel 自体にあるかのように、JPanel のほとんどのメソッドにアクセスできます。スーパークラスに存在するメソッドをオーバーロードすると、スーパーが重要になります。

あなたの場合、 add はオーバーロードされていないため、 super.add(Object j) と add(Object j) を呼び出すとまったく同じになります。

さらに、ポリモーフィズムとは、オブジェクトが複数の形式を取ることができるという概念です。それ自体であると同時にすべてのスーパー クラスであり、そのように参照できます。このボタン パネルの場合、以下のすべてがオブジェクトを構築するさまざまな方法です。

JButton j = new JButton();
Container c= new JButton();
Object o = new JButton();

(遅くなりましたが、これらの逆を持っていないことを願っています。誰かが私に知らせてください)

于 2012-09-27T03:55:07.467 に答える
0

JVM/コンパイラは、メソッドの可用性をチェックするのに十分スマートです。メソッドが現在のクラスで使用可能かどうかを確認します。の場合、使用可能なものを使用します。そうでない場合は、スーパー クラスをチェックします。利用可能な場合は、それを使用します。そうでない場合は、実装が見つかるまでもう 1 レベル上がります。クラスが見つからない場合、コンパイラはメソッドが見つからないというエラーを出します。

于 2012-09-27T03:57:38.177 に答える