【问题标题】:abstract, extends and creating instance issue [duplicate]抽象,扩展和创建实例问题[重复]
【发布时间】:2016-07-31 08:31:23
【问题描述】:

Klasse1 是一个抽象类,有一个foo() 方法。 Klasse2 扩展 Klasse1 并具有 doo() 方法,但不要覆盖 foo() 方法。

为什么我不能在Tester 类中调用doo() 方法?

Klasse1.java

public abstract class Klasse1 {
    public void foo() {
        System.out.println("Klasse1");
    }
}

Klasse2.java

public class Klasse2 extends Klasse1 {
    public void doo() {
        System.out.println("Klasse2");
    }
}

Tester.java

public class Tester {
    public static void main(String[] args) {
        Klasse1 k;
        k = new Klasse2();
        k.foo();
        k.doo(); // doesn't work
    }
}

【问题讨论】:

  • 因为Klasse1没有doo()
  • @Rehman 即troo
  • 你有一个引用类型if Klasse1,所以那个时候你只知道Klasse1能做什么/
  • @schwobaseggl 你的意思是真的吗? :)
  • @Rehman 嗯...与所有foodoo,我没有cloo ;)

标签: java instance abstract-class abstract extends


【解决方案1】:

在编译时,Java 编译器检查引用类型而不是实例类型。

在这种情况下,引用类型是Klasse1,它没有doo()。因此它会抛出一个错误。

【讨论】:

    【解决方案2】:

    Klasse1 没有 doo 方法,所以很自然。

    您可以将其转换为您的 Klasse2,然后像这样使用它:

    ((Klasse2)k).doo();
    

    【讨论】:

      【解决方案3】:

      KKlasse2 类的对象,但引用为 Klasse1

      K 可以调用Klasse1 声明的所有方法,并且可以调用Klasse2 声明的所有方法如果被强制转换为该类。

      示例:

      public class Tester {
          public static void main(String[] args) {
              Klasse1 k;
              k = new Klasse2();
              k.foo();
              ((Klasse2)k).doo(); // now works
          }
      }
      

      【讨论】:

      • 谢谢!这解决了我的问题!
      猜你喜欢
      • 1970-01-01
      • 2016-08-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多