我有这两个类:
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。 怎么解决?感谢
答案 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)
a
是Superclass
类型的引用,因此它只能访问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);
}