Java - 继承问题

时间:2013-08-27 13:07:26

标签: java inheritance

我有这两个类:

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)未定义类型Superclass。 怎么解决?感谢

7 个答案:

答案 0 :(得分:6)

当您通过Superclass类型的引用调用方法时,您只能使用Superclass API。 Superclass API不包含方法setname()

您可以通过在超类中声明方法来解决此问题。在这个例子中,它被声明为抽象,因此超类不需要定义它。

public abstract class Superclass 
{
  public Superclass();

  public abstract void setname(String name);
}

或者您可以将引用a的类型更改为子类:

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

答案 1 :(得分:2)

将变量'a'创建为

Childclass a = new Childclass();
a.setName("Roger");

答案 2 :(得分:1)

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

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

答案 3 :(得分:1)

将变量声明为:

ChildClass a = new ChildClass();

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

答案 4 :(得分:0)

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

答案 5 :(得分:0)

在父母子女关系中,您可以参考父母,并且可以像您一样创建儿童的对象。

Superclass a;
a = new ChildClass();

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

因此,您对a.setname("Roger");的调用无效,因为a属于超类类型,但没有setname(String) method but if you do something like ChildClass a = new ChildClass()then your call to a .setname(" Roger"); will be valid because一个is of type ChildClass which has setname(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);
    }
}

你在主要的地方称它为:

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

因此它将使用输出

进行编译和运行

名为Roger的ChildClass的setName()。

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

答案 6 :(得分:-1)

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

public abstract class Superclass 
{
  public Superclass(){
   }
  public abstract setname(String name);
}