【问题标题】:How to access sub class methods when sub class object is instantiated from abstact class从抽象类实例化子类对象时如何访问子类方法
【发布时间】:2014-01-18 04:43:29
【问题描述】:

我有一个名为 A 的抽象类和从它扩展的名为 B 的类。在 A 类中,我有一个方法的具体实现,也有抽象方法。在 B 类中,我重写了所有抽象方法和它自己的方法。

public abstract A{
   public boolean myConcreteMethod(){
      //implementation
   }

   public abstract void abstractMethod();
}

public class B extends A{
   @Override
   public void abstractMethod(){
       //implementation
   }

   public String aMethodBelongsToB(){
       //implementation
   }
}

现在当我实例化 B 的对象时,如下所示:

 A test = new B();

我无法访问

 test.aMethodBelongsToB();

我在这里做错了吗?任何帮助将不胜感激。

【问题讨论】:

  • 这是一个完整的正常行为。
  • A 没有方法 aMethodBelongsToB。使用B test = new B();?
  • 这与Aabstract 类完全无关。

标签: java class subclass instantiation abstract


【解决方案1】:

你没有B参考。所以,你不能调用它的方法。你必须做它

B test = new B();

现在,B 可以访问 A 的方法。因为 B 在 OOP 术语中是 A。 IS-A 关系!

【讨论】:

    【解决方案2】:

    当您实例化类B 时,您使用的是A 类型的引用变量。从此参考中,您只能访问在A 中声明的方法。该引用还可以指向继承自A 的其他类,这些类不具有在B 中声明的方法,因此编译器不允许您从对超类的引用中调用仅在子类中声明的方法。

    【讨论】:

      【解决方案3】:

      当您将B 值分配给A 类型的变量时,Java 语言表示无法调用B 特定的方法。要么这样做:

          B test = new B();
          test.aMethodBelongsToB();
      

      或者这个:

          A test = new B();
          ((B) test).aMethodBelongsToB();   
      

      注意:由于我们将test 转换为B,现在可以在类型转换子表达式的结果上调用B 特定的方法。


      变量/表达式的声明类型总是决定可以调用的方法(签名)。实际对象引用仅确定调用哪个实际方法(如果有方法覆盖)。要了解原因,请考虑以下几点:

      public class C extends A{
         @Override
         public void abstractMethod(){
             //implementation
         }
         ...
      }
      

      还有这个(这不是有效的 Java ...):

      A test;
      if (something) {
          test = new B();
      } else {
          test = new C();
      }
      test.aMethodBelongsToB();  // INVALID
      

      如果最后一条语句是合法的(但它不是!!)如果 something 是假的,那会发生什么?

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-03-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多