如何调用子类方法(Java)
How to call subclass method (Java)
我是 Java 的新手。我正在做一个作业,我有一个超类和几个子 类,其中一些子 类 具有其他子没有的属性。本质上,我必须创建一个 SuperClass 对象数组,然后使用 sub类.
之一初始化数组的每个元素
但是,当我尝试使用 sub类 的特定方法之一时,出现编译错误,告诉我方法 .getY()在 SuperClass 中找不到,但明确定义为 SuperClass 中的方法。
我将问题归结为以下代码(确保我仍然遇到相同的错误):
public class Whosebug {
public static void main(String[] args) {
/*
SubClass obj = new SubClass(4, 5);
System.out.println(obj.getX());
System.out.println(obj.getY());
*/
SuperClass[] arr;
arr = new SuperClass[5];
arr[0] = new SubClass(5, 10);
System.out.println(arr[0].getX());
System.out.println(arr[0].getY());
}}
public class SuperClass {
private int x;
public SuperClass(int x){
this.x = x;
}
public int getX() {
return x;
}
public void setX(int x) {
this.x = x;
}}
public class SubClass extends SuperClass{
private int y;
public SubClass(int x, int y){
super(x);
this.y = y;
}
public int getY() {
return y;
}
public void setY(int y) {
this.y = y;
}}
当我使用注释的代码时,我没有收到错误,这可能意味着错误来自于错误地使用 类 的数组。
有人可以帮我吗?
您声明的数组 arr
是类型为 (class) SuperClass 对象的数组。数组中的所有内容都必须是 SuperClass.
你的子class 命名为 SubClass IS 类型为 SuperClass — 它是 class 的扩展,添加了 y
和 getY
,但它仍然符合 SuperClass。任何你可以用 SuperClass 做的事情你也可以用 SubClass 做,所以你可以添加 SubClass 对象到类型 SuperClass.
你的错误所在,在arr[0].getY()
处,在arr[0]
处的东西实际上是一个子类,因为你只是把它放在那里,但是不能保证是这种情况——唯一的保证是数组中的东西属于SuperClass类型,并且属于类型SuperClass 没有 getY()
方法。
当您知道某事物属于SubClass类型时,您可以cast它,例如:(SubClass) arr[0]
,并且必须在附加方法调用之前 应用强制转换 ,所以它将是 ((SubClass) arr[0]).getY()
转换有它自己的潜在错误,如果你试图将某些东西转换为 SubClass 而那个东西实际上不是 SubClass 它将导致错误(但那是另一个讨论)。
所以“如何调用subclass方法”这个问题的答案是cast对象到subclass:
// Direct replacement for your line of code:
System.out.println( ((SubClass) arr[0]).getY() );
// or assign it to another variable first:
SubClass sc = (SubClass) arr[0];
System.out.println( sc.getY() );
如果您想调用 SubClass
上的方法,但您的数组是 SuperClass[]
类型,您必须 cast 对象:
SuperClass[] arr;
arr = new SuperClass[5];
arr[0] = new SubClass(5, 10);
SuperClass elem = arr[0];
SubClass subClassElem = (SubClass) elem; // here's the cast
subClassElem.getY();
// or shorter:
((SubClass) arr[0]).getY();
如果您不确定数组中的内容,请使用 instanceof
:
SuperClass elem = arr[0];
if(elem instanceof SubClass) {
SubClass subClassElem = (SubClass) elem;
subClassElem.getY();
}
方法 getY() 未在 SuperClass 中定义,并且由于您的数组是 SuperClass 类型,所以它无法识别它。
您可以将数组对象转换为 SubClass 以指定类型:
System.out.println(((SubClass) arr[0]).getY());
我是 Java 的新手。我正在做一个作业,我有一个超类和几个子 类,其中一些子 类 具有其他子没有的属性。本质上,我必须创建一个 SuperClass 对象数组,然后使用 sub类.
之一初始化数组的每个元素但是,当我尝试使用 sub类 的特定方法之一时,出现编译错误,告诉我方法 .getY()在 SuperClass 中找不到,但明确定义为 SuperClass 中的方法。 我将问题归结为以下代码(确保我仍然遇到相同的错误):
public class Whosebug {
public static void main(String[] args) {
/*
SubClass obj = new SubClass(4, 5);
System.out.println(obj.getX());
System.out.println(obj.getY());
*/
SuperClass[] arr;
arr = new SuperClass[5];
arr[0] = new SubClass(5, 10);
System.out.println(arr[0].getX());
System.out.println(arr[0].getY());
}}
public class SuperClass {
private int x;
public SuperClass(int x){
this.x = x;
}
public int getX() {
return x;
}
public void setX(int x) {
this.x = x;
}}
public class SubClass extends SuperClass{
private int y;
public SubClass(int x, int y){
super(x);
this.y = y;
}
public int getY() {
return y;
}
public void setY(int y) {
this.y = y;
}}
当我使用注释的代码时,我没有收到错误,这可能意味着错误来自于错误地使用 类 的数组。 有人可以帮我吗?
您声明的数组 arr
是类型为 (class) SuperClass 对象的数组。数组中的所有内容都必须是 SuperClass.
你的子class 命名为 SubClass IS 类型为 SuperClass — 它是 class 的扩展,添加了 y
和 getY
,但它仍然符合 SuperClass。任何你可以用 SuperClass 做的事情你也可以用 SubClass 做,所以你可以添加 SubClass 对象到类型 SuperClass.
你的错误所在,在arr[0].getY()
处,在arr[0]
处的东西实际上是一个子类,因为你只是把它放在那里,但是不能保证是这种情况——唯一的保证是数组中的东西属于SuperClass类型,并且属于类型SuperClass 没有 getY()
方法。
当您知道某事物属于SubClass类型时,您可以cast它,例如:(SubClass) arr[0]
,并且必须在附加方法调用之前 应用强制转换 ,所以它将是 ((SubClass) arr[0]).getY()
转换有它自己的潜在错误,如果你试图将某些东西转换为 SubClass 而那个东西实际上不是 SubClass 它将导致错误(但那是另一个讨论)。
所以“如何调用subclass方法”这个问题的答案是cast对象到subclass:
// Direct replacement for your line of code:
System.out.println( ((SubClass) arr[0]).getY() );
// or assign it to another variable first:
SubClass sc = (SubClass) arr[0];
System.out.println( sc.getY() );
如果您想调用 SubClass
上的方法,但您的数组是 SuperClass[]
类型,您必须 cast 对象:
SuperClass[] arr;
arr = new SuperClass[5];
arr[0] = new SubClass(5, 10);
SuperClass elem = arr[0];
SubClass subClassElem = (SubClass) elem; // here's the cast
subClassElem.getY();
// or shorter:
((SubClass) arr[0]).getY();
如果您不确定数组中的内容,请使用 instanceof
:
SuperClass elem = arr[0];
if(elem instanceof SubClass) {
SubClass subClassElem = (SubClass) elem;
subClassElem.getY();
}
方法 getY() 未在 SuperClass 中定义,并且由于您的数组是 SuperClass 类型,所以它无法识别它。 您可以将数组对象转换为 SubClass 以指定类型:
System.out.println(((SubClass) arr[0]).getY());