164

Khalid Mughal によるA Programmer's Guide to Java™ SCJP Certification を読んでいました。

継承の章では、次のように説明しています。

メンバーの継承は、宣言されたアクセシビリティと密接に関係しています。スーパークラスのメンバーがサブクラスで単純な名前でアクセスできる場合 (super のような追加の構文を使用せずに)、そのメンバーは継承されたと見なされます。

また、静的メソッドは継承されないことにも言及しています。しかし、以下のコードは完全に問題ありません。

class A
{
    public static void display()
    {
        System.out.println("Inside static method of superclass");
    }
}

class B extends A
{
    public void show()
    {
        // This works - accessing display() by its simple name -
        // meaning it is inherited according to the book.
        display();
    }
}

display()クラスで直接使用するにはどうすればよいですBか? さらに、B.display()動作します。

本の説明はインスタンスメソッドにのみ適用されますか?

4

15 に答える 15

204

アクセス可能なすべてのメソッドは、サブクラスによって継承されます。

Sun Javaチュートリアルから:

サブクラスは、サブクラスが含まれているパッケージに関係なく、その親のすべてのパブリック メンバーと保護されたメンバーを継承します。サブクラスがその親と同じパッケージに含まれている場合、親のパッケージ プライベート メンバーも継承します。継承されたメンバーをそのまま使用したり、置き換えたり、非表示にしたり、新しいメンバーで補足したりできます。

継承された静的 (クラス) メソッドと継承された非静的 (インスタンス) メソッドの唯一の違いは、同じシグネチャで新しい静的メソッドを作成すると、古い静的メソッドはオーバーライドされずに隠されることです。

オーバーライドと非表示の違いに関する ページから。

非表示とオーバーライドの違いには、重要な意味があります。呼び出されるオーバーライドされたメソッドのバージョンは、サブクラスのものです。呼び出される隠しメソッドのバージョンは、スーパークラスまたはサブクラスのどちらから呼び出されるかによって異なります

于 2012-04-24T05:11:14.493 に答える
25

次のコードで違いを体験できます。これは、コードをわずかに変更したものです。

class A {
    public static void display() {
        System.out.println("Inside static method of superclass");
    }
}

class B extends A {
    public void show() {
        display();
    }

    public static void display() {
        System.out.println("Inside static method of this class");
    }
}

public class Test {
    public static void main(String[] args) {
        B b = new B();
        // prints: Inside static method of this class
        b.display();

        A a = new B();
        // prints: Inside static method of superclass
        a.display();
    }
}

これは、静的メソッドがクラス メソッドであるためです。

A.display() と B.display() は、それぞれのクラスのメソッドを呼び出します。

于 2014-11-21T05:47:21.743 に答える
14

もしそれが本が本当に言っていることなら、それは間違っている.[1]

Java 言語仕様 #8.4.8 には次のように記載されています。

8.4.8 継承、上書き、非表示

クラス C は、その直接のスーパークラスから、次のすべてが真であるスーパークラスのすべての具象メソッド m (静的およびインスタンスの両方) を継承します。

  • m は、C の直接のスーパークラスのメンバーです。

  • m は public、protected、または C と同じパッケージ内のパッケージ アクセスで宣言されています。

  • C で宣言されたメソッドには、m の署名のサブ署名 (§8.4.2) である署名はありません。

[1] 2000 年版の私のコピーでは、そうは言っていません。

于 2015-04-19T03:43:36.217 に答える
5

B.display() は、静的宣言によりメソッド/メンバーが特定のクラス インスタンス (別名オブジェクト) ではなく、クラスに属するようになるため機能します。詳細については、こちらをご覧ください。

もう 1 つ注意すべき点は、静的メソッドをオーバーライドすることはできません。サブクラスで同じシグネチャを持つ静的メソッドを宣言することはできますが、その動作は予想とは異なる場合があります。これがおそらく遺伝とは見なされない理由です。問題のあるシナリオと説明はこちらで確認できます。

于 2012-04-24T05:12:59.737 に答える
3

静的メソッドは Java で継承されますが、ポリモーフィズムには関与しません。静的メソッドをオーバーライドしようとすると、スーパークラスの静的メソッドをオーバーライドする代わりに非表示にするだけです。

于 2014-06-24T10:39:33.727 に答える
0

静的メソッドはサブクラスに継承されますが、ポリモーフィズムではありません。静的メソッドの実装を記述する場合、親のクラス メソッドはオーバーライドではなく、オーバー ヒドゥンです。継承されていない場合、どうすればアクセスできますclassname.staticMethodname();か?

于 2014-09-07T11:01:18.153 に答える
0

静的メソッドをオーバーライドすることはできますが、ポリモーフィズムを使用しようとすると、クラス スコープに従って動作します (通常の予想とは異なります)。

public class A {

    public static void display(){
        System.out.println("in static method of A");
    }
}

public class B extends A {

    void show(){
        display();
    }

     public static void display(){
        System.out.println("in static method of B");
    }

}
public class Test {

    public static void main(String[] args){
        B obj =new B();
        obj.show();

        A a_obj=new B();
        a_obj.display();


    }


}

最初のケースでは、o/p は「B の静的メソッド内」です # オーバーライドの成功 2 番目のケースでは、o/p は「A の静的メソッド内」です # 静的メソッド - ポリモーフィズムを考慮しません

于 2015-05-06T06:32:46.937 に答える
0

パブリック メンバーとプロテクト メンバーはすべて任意のクラスから継承できますが、デフォルト メンバーまたはパッケージ メンバーは、スーパークラスと同じパッケージ内のクラスから継承することもできます。静的メンバーか非静的メンバーかに依存しません。

しかし、静的メンバー関数が動的バインディングに参加しないことも事実です。その静的メソッドの署名が親クラスと子クラスの両方で同じである場合、ポリモーフィズムではなく、シャドウイングの概念が適用されます。

于 2014-07-26T05:03:27.340 に答える
-3

継承は非静的メンバーのみであるため、静的メンバーはサブクラスに継承されません。また、静的メンバーはクラスローダーによって静的プール内にロードされます。継承は、オブジェクト内にロードされたメンバーのみを対象としています

于 2016-01-16T06:52:16.407 に答える