2

私はこの2つのクラスを持っています:

public class Superclass 
{
  public Superclass();

  ...

}

public class ChildClass extends Superclass
{
  public ChildClass();

  public setname(String name)
  {
   ...
  }

}

私がこれを行う場合:

Superclass a;
a = new ChildClass();
a.setname("Roger");

次の警告が表示されます: メソッド setname(String) はスーパークラス タイプに対して未定義です。解決方法は?ありがとう

4

7 に答える 7

6

型の参照を通じてメソッドを呼び出すとSuperclass、スーパークラス API に制限されます。スーパークラス API にはメソッドが含まれていませんsetname()

スーパークラスでメソッドを宣言することで、これを修正できます。この例では、スーパークラスで定義する必要がないように抽象として宣言されています。

public abstract class Superclass 
{
  public Superclass();

  public abstract void setname(String name);
}

aまたは、サブクラスへの参照のタイプを変更できます。

ChildClass a;
a = new ChildClass();
a.setname("Roger");
于 2013-08-27T13:08:48.700 に答える
1

変数を次のように宣言します。

ChildClass a = new ChildClass();

SuperClass 型の引数を取るメソッドに渡すことはできます。アイデアは、サブクラスがそのスーパークラスのいずれかに代用可能であるべきだということです。

于 2013-08-27T13:31:04.727 に答える
1

aSuperclass型の参照であるため、 に存在するものにのみアクセスできますSuperclass。親参照を使用してアクセスする場合はsetname、親クラスにもそのメソッドが必要です。

参照にアクセスできる属性とメソッドは、int 参照クラス/インターフェイスに存在し、それを含むオブジェクトには存在しないもののみです。

于 2013-08-27T13:08:52.547 に答える
0

親子関係では、親の参照を取得して、これまでと同様に子のオブジェクトを作成できます。

Superclass a;
a = new ChildClass();

aただし、オブジェクトがその参照クラスの設計図に従うという条件が 1 つあります。つまり、あなたの場合a、Superclass の参照があるためa、ChildClass ではなく Superclass で定義されているすべてのメソッドにアクセスできます。

したがって、 ChildClass a = new ChildClass() a. setname("Roger");を持たないタイプ Superclass であるため、への呼び出しa.setname("Roger");は有効ではありません。setname(String) メソッド。asetname(String) method but if you do something likethen your call towill be valid becauseis of type ChildClass which has

もう1つ、次のような構造があるとしましょう:

class SuperClass
{
    public SuperClass();
    public void setName(String name)
    {
        System.out.println("setName() of SuperClass with name "+name);
    }
}

class ChildClass extends SuperClass
{
    public ChildClass();
    public void setName(String name)
    {
        System.out.println("setName() of ChildClass with name "+name);
    }
}

そして、あなたはそれをメインで次のように呼び出します:

    ChildClass a;
a = new ChildClass();
a.setname("Roger");

そのため、出力でコンパイルおよび実行されます

Roger という名前の ChildClass の setName()。

そして、この出力の本当の理由を知っていると確信しています。:)

于 2017-04-11T10:31:35.137 に答える