【问题标题】:How to call subclass method (Java)如何调用子类方法(Java)
【发布时间】:2021-03-01 21:14:38
【问题描述】:

我对 Java 还很陌生。我正在做一个作业,我有一个超类和几个子类,其中一些子类具有其他子类没有的属性。本质上,我必须创建一个 SuperClass 对象数组,然后用其中一个子类初始化数组的每个元素。

但是,当我尝试使用其中一个子类的特定方法时,我收到一个编译错误,告诉我在 SuperClass.getY() /strong>,当它被明确定义为来自 SuperClass 的方法时。 我将问题归结为以下代码(确保我仍然得到相同的错误):

public class StackOverFlow {
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 包含 SuperClass 的实例,并且该类没有方法 getY
  • 您不能在更通用的超类上使用子类特定的方法。如果您想解决它,请查看强制转换和 instanceof 的使用

标签: java arrays oop subclass superclass


【解决方案1】:

您声明的数组arr 是一个类型(类)SuperClass 对象的数组。数组中的所有内容都必须是 SuperClass

您的子类名为 SubClass ISSuperClass 类型的东西——它是该类的扩展,通过添加ygetY,但它仍然符合SuperClass。你可以用 SuperClass 做的任何事情都可以用 SubClass 做,所以你可以将 SubClass 对象添加到 SuperClass 类型的数组中。

你的错误在哪里,在arr[0].getY(),在arr[0] 的地方实际上是一个子类,因为你只是把它放在那里,但是不能保证 就是这样——唯一的保证是数组中的东西是 SuperClass 类型的,而 SuperClass 类型的东西没有getY() 方法.

当你知道某事物是SubClass类型时,你可以cast它,比如:(SubClass) arr[0],并且必须将它括起来以应用强制转换在您附加方法调用之前,所以它是((SubClass) arr[0]).getY()
转换有它自己的潜在错误,如果您尝试将某些东西转换为 SubClass 而该东西实际上不是 SubClass 它将导致错误(但这是另一个讨论) .

所以“如何调用子类方法”这个问题的答案是cast对象到子类:

// 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() );

【讨论】:

  • 非常感谢,我将不得不了解更多有关铸造的信息。我以前很迷茫,但现在我知道该怎么做了。是的,我明白为什么这些名字会令人困惑。在我的实际作业中,我以不同的方式命名了这些类(Lavadora 和 Herramientas),但我认为概括起来会更容易。现在我发现这可能会让试图帮助我的人感到困惑。以后我会牢记这一点
【解决方案2】:

如果您想在 SubClass 上调用方法,但您的数组类型为 SuperClass[],则必须强制转换对象:

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();
}

【讨论】:

  • 谢谢,我不知道演员表。我会阅读它,但这肯定有助于解决我的问题
【解决方案3】:

方法 getY() 未在 SuperClass 中定义,并且由于您的数组是 SuperClass 类型,因此它无法识别它。 您可以将数组对象转换为 SubClass 以指定类型:

        System.out.println(((SubClass) arr[0]).getY());

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-15
    • 2019-05-19
    相关资源
    最近更新 更多