1

このオブジェクト(タイトルに記載)は子クラスでオーバーライドされたメソッドを呼び出すことができるので、子クラスの他のメソッドを呼び出せないのはなぜですか? メモリ構成、JVM の内部ロジックなど、できるだけ詳細な回答が必要です。

以下のコードにより、私の質問を明確に理解できます。

class A
{
  int x=10;
  public  A()
  {
    System.out.println("Constructor of class A called!!!");
  }

  public void sayGreetings()
  {
    System.out.println("accept hye from class A");
  }
}

class C extends A
{
  int x=30;//why this is not accessed by stated object.
  public C()
  {
    System.out.println("Constructor of Class C caled!!!");
  }
  public void sayGreetings()
  {
    System.out.println("accept hye from class C");
  }
  public void ssa()
  {
    System.out.println("Sat Sri Akal ji from class C");
  }
}

public class ParentClassTypeObject 
{
  public static void main(String[] args)
  {
    C cObj=new C();
    cObj.sayGreetings();
    cObj.ssa();
    A aCObj=new C();//this is let say stated object,main object
    aCObj.sayGreetings();/*here we invoked method will be child class's 
                         overriden method.*/
    //aCObj.ssa(); //why this line gives error

    System.out.println("x="+aCObj.x);
  }
}
4

8 に答える 8

4

オブジェクトに対して必要なインターフェイスは、次のように記述したときに選択したものであるためです。

A aCObj = new C();

C変数を介してプロパティにアクセスする場合はaCObj、それをとして宣言しますC

にすることで、A後でこれを書くことができます。

aCObj = new A();

Aしたがって、変数は、、またはを指すことができるためC、コンパイラーは、型によって公開されるインターフェースによって定義されたメソッドへのアクセスに制限しますA

Cこれらのメソッドの定義には引き続きアクセスできます。これは、OOP(ポリモーフィズム)の主要なポイントの1つだからです。

于 2013-03-13T17:54:39.500 に答える
4

参照変数は、同じタイプのオブジェクトまたは同じタイプのサブセットを指します。

親と子は、親がスーパー クラスであり、子が親クラスを継承する 2 つのクラスであると考えてください。下の画像が詳しい説明になります。 ここに画像の説明を入力

上の図では、親クラスの参照変数は、子オブジェクトで親クラス オブジェクトを検索します。そこにあるので、それを見つけます。出力を提供します。また、子クラスに同じメソッドがある場合(メソッドのオーバーライド) ) 子クラスのオーバーライドされたメソッドを実行します。

しかし、子クラスの参照変数については、親クラスのオブジェクトで子クラスのオブジェクトを見つけることができないので、ここでは不可能です。

ここに画像の説明を入力

これで混乱が解消されることを願っています。

于 2016-05-28T22:20:10.383 に答える
2

コンパイラは、参照変数の型に基づいてメソッドを呼び出すことができるかどうかを判断します。したがって、参照変数がクラス A の場合、クラス A のメソッドのみを呼び出すことができます

ただし、コンパイラは、参照変数の型ではなく、オブジェクトの実際の型に基づいて呼び出すメソッドを決定し、継承ツリーのボトムアップ チェックを開始します (サブクラスから開始します)

したがって、この場合aCObj.sayGreetings();、コンパイラが最初に aCObj の参照型をチェックすると言うと、Aクラス A にはsayGreetings()メソッドがあるので問題ありません。しかし、実際のオブジェクトは aです。Cしたがって、コンパイラはサブクラス (C) から開始して、このメソッドがスーパークラス (A) まで実装されています。メソッド`sayGreetings()は C クラスでオーバーライドされます。したがって、C class sayGreetings() method(サブクラスの)を呼び出します。

一方、ssa()メソッドはクラス C であり、参照変数はクラス A であるため、試してみるとコンパイラはエラーを出します。aCObj.ssa();

それは単なるポリモーフィズムです。A クラス参照変数は A オブジェクトまたは C オブジェクトのいずれかである可能性があるため、コンパイラはスーパークラス A のメソッドである共通のメソッドのみにアクセスを制限します。次に、このメソッドがクラスで実装されているかどうかを確認します実際のオブジェクト (C)。 そうでない場合は、スーパークラス (A) に移動し、スーパークラスのメソッドを呼び出します。しかし、実装されている場合は、サブクラス (C) のメソッドを呼び出します。

于 2013-09-15T21:03:26.257 に答える
0

aCObjタイプとして宣言されているためA、タイプAで宣言されたメソッドのみにアクセスできます。コンパイラは、それがタイプCであることを保証できません。

例えば

あなたも持っているかもしれません

public class B extends A {
    public void sayGreetings() {
        ...
    }
}

これにはssaメソッドはありませんが、タイプAとして宣言されたオブジェクトに割り当てることができます。

于 2013-03-13T17:54:41.107 に答える
0

オブジェクトはCではなくA型であるため、インスタンス変数にアクセスすることはできません。パブリックにすると、アクセスできると思います。

于 2013-03-13T17:59:02.420 に答える
0

ケース 1. 親クラスの参照変数は、その子クラスのオブジェクトを指すことができます. ケース 2. その子クラスのオブジェクトを指す親クラスの参照変数は、その子のオブジェクトに型キャストすることができます.クラス。

ケース 1: 親クラスの参照変数は、親クラス内で定義されているメソッドのみを呼び出すことができ、親クラスのメソッドをオーバーライドしている子クラスのメソッドを呼び出すこともできます。ただし、排他的のみであるメソッドを呼び出すことはできません子クラスで。

ケース 2: 親クラスの参照変数は、その子クラスのメソッドも呼び出すことができます。

これはポリモーフィズムの原理によるものです。

于 2013-06-20T10:24:57.493 に答える