28

Javaでプライベートメソッドをオーバーライドできますか? いいえの場合、次のコードはどのように機能しますか?

class Base{
      private void func(){
            System.out.println("In Base Class func method !!");         
      };
}

class Derived extends Base{
      public void func(){   //  Is this a Method Overriding..????        
            System.out.println("In Derived Class func method"); 
      }      
}

class InheritDemo{
      public static void main(String [] args){                      
            Derived d = new Derived();
            d.func(); 
      }
}
4

12 に答える 12

51

いいえ、あなたはそれを上書きしていません。でマークして@Overrideみるか、 を呼び出してみて確認できsuper.func();ます。どちらも機能しません。コンパイラ エラーをスローします。

さらに、これをチェックしてください:

クラスベース{
      プライベートボイド機能(){
            System.out.println("In base func メソッド");         
      };
      public void func2() {
          System.out.println("func2");
          関数();
      }
}

class Derived extends Base {
      public void func(){ // これはオーバーライド メソッドですか?
            System.out.println("In Derived Class func method");
      }
}

クラス InheritDemo {
      public static void main(String [] args) {
            派生 D = new Derived();
            D.func2();
      }
}

それは印刷されます:

func2
In base func method

public に変更するfunc()とオーバーライドになり、出力は次のように変更されます。Base

func2
In Derived Class func method
于 2012-08-15T20:17:57.357 に答える
21

いいえ、サブクラスは親のプライベート メンバーを継承しないため、プライベート メソッドをオーバーライドすることはできません。スーパークラス メソッドとは関係のないサブクラスの新しいメソッドを宣言しました。super.func()これを調べる 1 つの方法は、Derived クラスでの書き込みが合法かどうかを自問することです。オーバーライドするメソッドがオーバーライドしているメソッドにアクセスすることを禁止する方法はありませんが、これはまさにこの場合に当てはまります。

于 2012-08-15T20:10:29.497 に答える
3

いいえそうではありません。次のように確認するためだけにオーバーライドをマークできます。

@Override
public void func(){
     System.out.println("In Derived Class func method"); 
}

そしてこの場合、それはコンパイルエラーになります。

于 2012-08-15T20:08:37.630 に答える
3

あなたはオーバーライドしていません。プライベート メンバーをオーバーライドすることはできません。Derived で新しいメソッドを定義しているだけです。func()Derived には、非公開として宣言されているため、ナレッジ ベースの実装がありません。Derived で定義してもコンパイラ エラーは発生しfunc()ませんが、これは Derived が Base に の実装があることを認識していないためですfunc()。明確にするために、 Base の の実装をオーバーライドしていると言うのは正しくありませんfunc()

于 2012-08-15T20:10:29.920 に答える
3

すでに正しい答えに加えて、これを考慮してください。

public class Private {
    static class A {
        public void doStuff() {
            System.out.println(getStuff());
        }

        private String getStuff() {
            return "A";
        }
    }

    static class B extends A {
        public String getStuff() {
            return "B";
        }
    }

    public static void main(String[] args) {
        A a = new A();
        a.doStuff();
        a = new B();
        a.doStuff();
        B b = new B();
        b.doStuff();
    }
}

これは印刷されます

B「オーバーライド」しますがgetStuff()Aの実装は のdoStuff()呼び出しA#getStuff()に固定されているため、ポリモーフィズムはトリガーされません。

于 2018-04-15T07:28:06.840 に答える
1

いいえ、あなたのようなことをしBase b = new Derived();ても、まだ b.func() を呼び出すことができないからです。あなたがしていることは「隠れる」と呼ばれます。

于 2012-08-15T20:13:54.310 に答える
0

メソッドはプライベートであるため、他のクラスからは見えません。したがって、派生クラスはこのメソッドを継承しません。したがって、これはオーバーライドの場合ではありません

于 2015-12-03T10:22:45.137 に答える
0

実際、あなたはオーバーライドしていません.Before Java5

オーバーライドされたメソッドの戻り値の型は、親クラスのメソッドと一致する必要があります。

しかし、Java 5 では、共変の戻り値の型と呼ばれる新しい機能が導入されました。同じシグネチャを持つメソッドをオーバーライドできますが、返されるオブジェクトのサブクラスを返します。つまり、サブクラスのメソッドは、スーパークラスの同じシグネチャを持つメソッドによって返される型のサブクラスである型を持つオブジェクトを返すことができます。あなたはこのスレッドに従うことができます:オーバーライドされたメソッドは戻り値の型で異なりますか?

于 2017-01-05T08:39:33.000 に答える
0

メソッドの隠蔽は、オーバーライドの代わりにここで行われます。静的な場合に何が起こるかのように。

于 2016-08-09T09:30:50.323 に答える
-1

以下のコード スニペットのコメントを読んで、答えを見つけてください。

ソース:

  1. 定義参照:

  2. 「Jeanne Boyarsky」および「Scott Selikoff」の書籍「OCA Oracle Certified Associate Java SE 8 Programmer Study Guide Exam 1Z0-808 Book」のソース コード例 (参照) のクレジット。

     public class Deer {
            public Deer() { System.out.print("Deer"); }
            public Deer(int age) { System.out.print("DeerAge"); }
            private boolean hasHorns() {  return false; }
            public static void main(String[] args) {
                Deer deer = new Reindeer(5);
                System.out.println(","+deer.hasHorns());// false is printed.
            }
        }
        class Reindeer extends Deer {
            public Reindeer(int age) { System.out.print("Reindeer"); }
            private boolean hasHorns() { return true; } // Overriding possible, but is of no use in the below context.
            // Below code is added by me for illustration purpose
            public static void main(String[] args) {
                Deer deer = new Reindeer(5);
                //Below line gives compilation error.
                //System.out.println(","+deer.hasHorns());
            }
        }
    
于 2018-03-16T12:00:46.727 に答える