【问题标题】:How to call subclass method through superclass instance in java?java中如何通过超类实例调用子类方法?
【发布时间】:2015-11-26 23:18:34
【问题描述】:

假设我们有一个超类,比如

public class Superclass  
{  
    public void method1() {  
        // do something 
    }  
}// end Superclass

和一个子类,例如

public class Subclass extends Superclass
{
    public void method1() {
        //override method1() of Superclass
    }

    public void method2() {
        // bla bla bla
    }
}// end Subclass

现在考虑下面的代码

public static void main( String[] args ) {
    Superclass obj = new Subclass();
}

我正在寻找一种通过变量 obj 调用 method2() 的方法。有没有办法做到这一点?如果是这样,如何完成这项任务?

【问题讨论】:

  • 你必须投它:((Subclass) obj).method2()
  • 你不能没有铸造。子类型分层地“扩展”超类型。这不会从孩子到父母“向上”。

标签: java


【解决方案1】:

正如上面的评论所指出的,如果你需要这样做,这可能表明你的类没有正确建模。

通常更好的方法是在超类型中提供默认实现,并简单地让子类型覆盖实现。

例如:

public class Superclass {
  public void method1() {
    // method1 implementation
  }

  public void method2() {} // empty implementation
}

public class Subclass extends Superclass {
  @Override
  public void method2() {
    // do subclass stuff
  }
}

然后在您的呼叫站点,您只需要这样做:

Superclass obj = new Subclass();
// Since the runtime type is Subclass, this calls Subclass's
// implementation of method2
obj.method2();

【讨论】:

    【解决方案2】:

    为此,您必须将其 obj 转换为 SubClass

    ((Subclass) obj).method2();
    

    【讨论】:

    • @Alnitak:Java 中没有。你在考虑 C++ 类切片吗?这不适用于这里。运行时类型实际上是Subtype,即使编译时类型是Supertype
    • @Alnitak - 它将编译,并带有警告。显然,正如任何向下转换一样,应该谨慎进行,并且只有当您确定(或使用instanceof 验证)obj 确实是子类时。但这是一个关于如何做到的理论问题,这就是它如何做到的
    • @NirLevy:Java 编译器不会针对缩小转换发出警告。如果强制转换在运行时无效,则会抛出 ClassCastException
    • 该死 - 我误读了构造函数调用 - 我以为 OP 正在实例化一个 SuperClass 对象。
    • @Alnitak:是的。如果运行时类型实际上是Superclass,那么代码肯定会抛出ClassCastException。如果您知道类型实际上是 Subclass(例如,如果您刚刚完成了 instanceof 的检查),那么缩小演员表是安全的。但即使它是安全的,它也可能不是一个好主意,因为Superclass 的用户不必关心它的实现。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-18
    • 1970-01-01
    • 2012-04-25
    • 2020-07-15
    • 2019-05-19
    • 1970-01-01
    相关资源
    最近更新 更多