我目前正在学习继承,而我在理解这个概念方面遇到了一些麻烦。 对于以下代码,有人可以告诉我为什么我不能声明类型超类的子类吗?
public class Test{
public static void main(String[] args){
Superclass myA = new Superclass();
Superclass myB = new Subclass();
}
public class Superclass{
private string a;
public Superclass()
{
a="";
}
public void setA(String userA)
{
a = userA;
}
}
public class Subclass extends Superclass{
private String b;
public Subclass()
{
b = "";
}
public void setB(String userB)
{
b = userB;
}
public void display()
{
System.out.print(b)
}
}
myA不会给我任何问题,但myB确实如此。我想做一个让我们说Superclass的数组, 但我希望能够使用Subclass.Something like this
Superclass[] X = new Superclass[2];
x[0] = new Subclass();
X[0].setB("hello");
X[0].display();
答案 0 :(得分:0)
这里的主要乐趣是每当你在引用上调用任何方法时,该方法应该出现在它的类声明中。
可以调用或不调用方法在引用类型上决定,但是要调用哪个实现实例是根据其对象类型决定的。
因为setB()
编译器中没有SuperClass
方法,因此不知道此方法的来源,因此会产生编译时错误。
希望它有所帮助!
答案 1 :(得分:0)
将子类中的setB()
重命名为setA()
,将函数display()
添加到您的SuperClass,并将您的子类上的setA()
称为X[0].setA("hello");
,您将看到这是如何运作的。
答案 2 :(得分:0)
像这样更改代码 - 将setA()和setB()更改为set() - 您的代码将起作用。该行为称为多态,是OO编程的主要概念之一。
public class Superclass{
private string a;
public Superclass()
{
a="";
}
public void set(String userA)
{
a = userA;
}
}
public class Subclass extends Superclass{
private String b;
public Subclass()
{
b = "";
}
@override
public void set(String userB)
{
b = userB;
}
public void display()
{
System.out.print(b)
}
}
答案 3 :(得分:0)
您正在尝试将子类型对象分配给它的超类类型对象X [0]。
因此在分配时不会显示任何错误。但是你可以在子类中调用那些与超类中名称相同的方法。
例如
如果重命名 setB()为 setA(),您可以找到预期的结果,但无法调用setB()
现在尝试分配 myB = X [0]; 并运行
您将收到此错误:线程“main”中的异常java.lang.NullPointerException
现在,如果你创建一个Subclass的新对象,即Subclass subc = new Subclass();
并尝试将X [0]分配给子,子= X [0]; 你会得到这个错误,不兼容的类型(必需的子类,找到超类)
答案 4 :(得分:0)
您正在将子类对象分配给超类类型变量(即完成向上转换),这很好。 但是当你这样做时,只能访问超类方法。因此,为了访问子类方法,请向下转换为其子类类型。 例如。
Superclass[] X = new Superclass[2];
X[0] = new Subclass();
((Subclass) X[0]).setB("hello");
((Subclass) X[0]).display();
答案 5 :(得分:0)
您的X变量属于Superclass类型,因此您只能访问此类或其超类中的可见方法和属性(Superclass的超类,而不是它的子类)。
您认为可以调用setB()
方法的问题是,您看到要分配给Superclass[] X
的对象类型是新Superclass[2]
,所以当您获得对此类型的引用时会发生什么一个对象作为方法中的属性?你甚至不知道它的来电者,如果它甚至有子类你可以猜测和调用它的子类的哪些方法? 你不能