Java 如何将子类作为超类类型调用
我目前正在学习继承,在理解这个概念时遇到了一些困难。 对于下面的代码,有人能告诉我为什么不能声明超类类型的子类吗Java 如何将子类作为超类类型调用,java,superclass,Java,Superclass,我目前正在学习继承,在理解这个概念时遇到了一些困难。 对于下面的代码,有人能告诉我为什么不能声明超类类型的子类吗 public class Test{ public static void main(String[] args){ Superclass myA = new Superclass(); Superclass myB = new Subclass(); } public class Superclass{ private string a;
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[] X = new Superclass[2];
x[0] = new Subclass();
X[0].setB("hello");
X[0].display();
这里的主要乐趣在于,无论何时调用引用上的任何方法,该方法都应该出现在其类声明中 方法是否可以调用取决于引用类型,但要调用的实现实例取决于其对象类型 因为在超类中并没有setB方法,所以编译器不知道这个方法来自哪里,所以它会给出编译时错误
希望有帮助 将子类中的setB重命名为setA,将函数display添加到超类中,并将子类中的setA调用为X[0];您将看到这是如何工作的。像这样更改代码-将setA和setB更改为set-您的代码将工作。这种行为称为多态性,是面向对象编程的主要概念之一
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)
}
}
您正在尝试将子类类型对象分配给它的超类类型对象X[0] 因此,在分配时不会显示任何错误。但您可以在子类中调用与超类中同名的方法 比如说 如果将setB重命名为setA,则可以找到预期结果,但不能调用setB 现在尝试分配myB=X[0];跑 您将得到以下错误:线程主java.lang.NullPointerException中出现异常 现在,如果您创建一个新的子类对象,即Subclass subc=newsubclass 并尝试将X[0]分配给subc,subc=X[0];
您将得到这个错误,不兼容的类型需要子类,发现了超类您正在将子类对象分配给一个超类类型变量,也就是说,上传完成了,没问题。 但是当你这样做的时候,只有超类方法可以被访问。因此,为了访问子类方法,请对其子类类型进行向下转换。 例如
您的X变量属于超类类型,因此您只能访问此类或其超类中的可见方法和属性超类的超类,但不能访问其子类。 您认为可以调用setB方法的问题是,您看到的是分配给超类[]X(新的超类[2])的对象类型,因此当您在方法中将此类对象的引用作为属性时会发生什么?你甚至不知道它是调用方,如果它有子类,你可以猜测和调用它的子类的什么方法?你不能
Superclass[] X = new Superclass[2];
X[0] = new Subclass();
((Subclass) X[0]).setB("hello");
((Subclass) X[0]).display();