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 回答
2

创建一个变量'a'作为

Childclass a = new Childclass();
a.setName("Roger");
于 2017-06-01T03:26:31.083 回答
1

aSuperclass类型的引用,因此它只能访问Superclass. 如果您想setname使用父引用进行访问,那么您还需要在父类中拥有该方法。

引用可访问的属性和方法仅是存在于引用类/接口中而不是包含对象中的属性和方法。

于 2013-08-27T13:08:52.547 回答
1

将变量声明为:

ChildClass a = new ChildClass();

您仍然可以将它传递给采用 SuperClass 类型参数的方法。这个想法是子类应该可以替代它的任何超类。

于 2013-08-27T13:31:04.727 回答
0

您正在使用 ChildClass 创建 SuperClass 类型的对象,只有您可以访问 SuperClass 和子类的成员和方法,反向是不可能的。 ChildClass a=new ChildClass(); 这会帮助你。

于 2014-06-24T04:55:39.683 回答
0

在父子关系中,您可以获取父级的引用,并可以像您所做的那样创建子级的对象。

Superclass a;
a = new ChildClass();

但是有一个条件是对象a遵循其引用类的蓝图,这意味着在您的情况下a具有超类的引用,因此a可以访问在超类中定义的所有方法而不是在 ChildClass 中。

所以你的调用a.setname("Roger");是无效的,因为a它的类型超类没有setname(String) method but if you do something likeChildClass a = new ChildClass() then your call toa.setname("Roger"); will be valid because一个is of type ChildClass which hassetname(String) 方法。

还有一件事,假设您的结构为:

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);
    }
}

你在 main 中调用它:

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

所以它会编译并运行良好并输出

名称为 Roger 的 ChildClass 的 setName()。

我相信你现在知道这个输出的真正原因了。:)

于 2017-04-11T10:31:35.137 回答
-1

在超类中将方法声明setname为抽象。

public abstract class Superclass 
{
  public Superclass(){
   }
  public abstract setname(String name);
}
于 2021-02-14T20:06:33.893 回答