【问题标题】:Call to method from Parent Abstract Class从父抽象类调用方法
【发布时间】:2014-07-13 13:59:01
【问题描述】:

我只是想详细了解 java 的抽象类和接口。 我在 SO 中阅读了一些与从抽象类和接口一起覆盖和实现相同签名方法相关的问题。

参考:OneTwo

之后,我只是尝试使用自己的代码更清楚地了解这个概念。 然后我遇到了几个问题:

  1. 如何调用抽象类中写的具体方法?
  2. 如果对象是C 类型,在AI 之间是否可以进行类型转换?

我已尝试使用以下代码:

public class TestMethods {

  public static void main(String[] args) {
    C c1 = new C();
    c1.methodOne();
    c1.methodTwo();

    // Q.1
    A c2 = new C();
    // HOW TO CALL METHOD IN CLASS A WITH c2
    c2.methodOne(); // I want to call here methodOne() from A

    // Q.2
    I c3 = new C();
    A c4 = (A) c3;
    // WILL THIS TYPE CASTING WORKS
    // HOW TO CALL METHOD IN CLASS A WITH c4
    c4.methodOne();
    c4.methodTwo();
  }

}

class C extends A implements I{

  @Override
  public void methodTwo() {
    System.out.println("Method Two in Concrete Class C");
  }

  @Override
  public void methodOne(){
    System.out.println("Method One in Concrete Class C");
  }

}


abstract class A{
  public void methodOne(){
    System.out.println("Method One in Abstract Class A");
  }

  public abstract void methodTwo();
}

interface I{
  public void methodOne();
  public void methodTwo();
}

添加

Q.3
根据以下答案之一中的建议,我可以从C 类中调用super.methodOne()。但是,如果我没有从我的具体类 C 调用 super 以从其扩展父抽象类 A 调用具体方法怎么办?而且我不想修改我的具体类C,那么我可以调用超类中的方法吗?

【问题讨论】:

  • 我尝试了一些代码并提出了一些我没有找到答案的问题。

标签: java interface abstract-class overriding


【解决方案1】:
  1. 你可以用super.methodOne()调用具体方法
  2. 您可以将 C 转换为 A,将 C 转换为 I,而不是相反,因为 C 拥有 A 所拥有的一切,但还可以拥有更多,因此 C 是 A,但 A 不是 C。

【讨论】:

  • 对于 Q.1 - 我应该从哪里调用此 super.methodOne(),因为我想在创建 c2 对象后调用。我尝试调用((A)c2).methodOne(),但它仍然调用C 的方法。对于 Q.2 我的问题是,如果对象的类型为 C,我能否将 I 的引用转换为 A 的引用。
  • 1.您可以从 C 类中的任何位置调用 super.methodOne()。 2. 是的,您可以,但前提是您确定它是 A 或 C 类型的对象。
  • 好的。我尝试在C 中添加public void methodSuper(){ super.methodOne(); } 并从我的主目录中调用此methodSuper(),但是当我使用A 的引用时,即使对象的类型为C,我也不允许调用methodSuper()
  • 引用类型在运行时并不重要。
猜你喜欢
  • 1970-01-01
  • 2020-08-09
  • 2017-05-02
  • 1970-01-01
  • 1970-01-01
  • 2013-09-17
  • 2016-06-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多