11

興味深いコード スニペットを次に示します。

public class Superclass {

    public static void main (String[] args){
        Superclass obj = new Subclass();
        obj.doSomething(); #prints "from Superclass"
    }

    private void doSomething(){System.out.println("from Superclass");}
}

class Subclass extends Superclass {

    private void doSomething(){System.out.println("from Subclass");}

}

サブクラスがその親のプライベート メンバーを継承しないことはわかっていますが、ここで obj は、アクセスできないはずのメソッドを呼び出すことができます。コンパイル時には obj はタイプ Superclass であり、実行時にはタイプ Subclass です。

これはおそらく、doSomething() への呼び出しがドライバー クラス内で行われているという事実と関係があります。これはたまたま独自のクラスです (そして、そもそも doSomething() を呼び出すことができる理由)。

要するに、obj はその親のプライベート メンバーにどのようにアクセスできるのでしょうか?

4

9 に答える 9

18

プライベート メソッドは所有者専用です。

所有者の子供、親戚、友人でさえありません。

于 2013-01-18T03:55:08.247 に答える
15

あなたは自分で答えました。プライベート メソッドは継承されないため、スーパークラス参照は独自のプライベート メソッドを呼び出します。

于 2013-01-18T03:47:04.960 に答える
5
Superclass obj = new Subclass();

この時点で、は、とオブジェクトobjの両方です。変数の宣言で使用するという事実は、それをキャストするだけの問題です。SubclassSuperclassSuperclass

次のことを行うobj.doSomething()と、コンパイラに。のプライベートメソッドを呼び出すように指示しdoSomething()ますobj。内部のメインの静的メソッドから実行しているためSuperclass、コンパイラーはそれを呼び出すことができます。

Subclassのメソッドではなく、のメインメソッドを使用する場合、Superclassそのメソッドにアクセスすることはできません。これは、あなたが言ったように、それは継承されておらず、の定義の一部でもないためですSubclass

つまり、基本的に継承を正しく理解しました。問題は、プライベートメソッドの可視性に関連していました。

于 2013-03-17T20:04:17.193 に答える
5

Superclassのメソッド内で from にキャストしているため、機能しますSuperclass。そのコンテキストでSuperclass.doSomethingは、コンパイラで使用できます。

スーパークラスとサブクラスを、メソッドを含むクラスとは関係のない 2 つの異なる任意のクラス A と B に変更しmain、同じコードを試した場合、コンパイラはメソッドにアクセスできないと文句を言うでしょう。

于 2013-01-18T04:01:23.447 に答える
3

この行を使用した場合:

Superclass obj = new Subclass();

サブクラスを、スーパークラスのメソッドと同じデータのみを使用するスーパークラス オブジェクトにキャストしました。サブクラスにキャストし直すと、次のようにサブクラスのメソッドを再度使用できます。

((Subclass)obj).doSomething(); #prints "from Subclass"
于 2013-01-18T03:50:31.047 に答える
0

この質問を理解するために、プライベート メソッドをスーパー クラスとサブ クラスのメンバー変数に関連付けることができます。

したがって、メンバー変数はサブクラスでオーバーライドされないことがわかっています。

例えば:

Class A{
 int i = 10;
}

Class B extends A{
  int i = 11;
}

Class C extends A {
   int i = 12;
}

A a1 = new B();
print(a1.i) // Will print 10

A a2 = new B();
print(a2.i) // Will print 10 

継承参照変数スーパークラスがない場合も同様の方法が考えられます。

于 2016-10-12T15:14:26.810 に答える
-1

派生クラスで同じ名前のプライベート メソッドを定義すると、派生クラスはプライベート メンバーを継承しないため、新しいメソッドになります。

プライベート メソッドはクラスの外でも見えないため、派生クラスから基本クラスのプライベート メソッドを呼び出すことはできず、コンパイル エラーがスローされます。

スレッド「メイン」の例外 java.lang.Error: 未解決のコンパイルの問題: タイプ Base のメソッド aPrivateMethod() が表示されません

親クラス参照へのダウン キャストを使用して、その派生クラスでのみアクセスできる派生クラスのプライベート メソッドを呼び出すことができます。

于 2015-12-31T22:41:30.233 に答える