由于这个多态性的基本例子中的语法有什么区别吗? (JAVA)

问题描述 投票:0回答:6

假设我有一个超类BigClass,以及继承自它的子类LittleClass。 BigClass有一个方法DoThing(),而LittleClass有一个具有不同功能的重写DoThing()方法。

以这种方式实例化子类是否有所不同:

BigClass myNewClass = new LittleClass();

或这个:

LittleClass myNewClass = new LittleClass();

我可以看到为什么第一个更有用,因为你可以在一行中声明许多不同的子类,但除此之外是否有任何区别?

java inheritance polymorphism
6个回答
0
投票

BigClass引用只能访问BigClass功能,无论它在何处实现(例如,BigClassLittleClass)。换句话说,如果LittleClass有一个方法没有覆盖BigClass的东西你就不能用BigClass引用来调用它。


0
投票

在运行时没有区别(从某种意义上说,你的意思是)。在两种情况下,myNewClass变量都指向LittleClass类型的对象。您调用它的任何方法都将在派生类(LittleClass)中执行,如果它明确地覆盖它们。如果没有,它们将在超类中搜索/调用,如果不在超类中等等。

不同之处在于编译时。如果你在下一行尝试调用method定义的某个方法LittleClass(但不是BigClass),这将不会在第一个场景中编译,而是在第二个场景中编译。


0
投票

DoThing()方法而言,没有区别。

现在,假设LittleClass类具有未被继承的DoEverything()方法,因为它甚至不存在于超类中。

在这种情况下,myNewClass.DoEverything()仅在您的第二种情况下合法(使用LittleClass()类型的参考变量)。


0
投票

第一个是有用的,因为您可以使用基类处理程序具有多态行为。如果您知道Base Class处理程序将始终只具有此Derived Class对象,则具有基类或派生类的Handler没有太大区别。

另一个区别是Base类处理程序无法访问Derived Class中实现的非抽象方法。


0
投票

区别仅在于第一种情况

BigClass myNewClass = new LittleClass();

你只能使用

myNewclass

对象访问方法属于超类。


0
投票

一个例子是工厂设计模式:在工厂模式中,您将拥有一个根据用户需要创建各种子类的方法,在这种情况下返回类型将是BigClass。

示例:

class Factory {

  public BigClass getInstance(int type) { 

     switch(type) {
        case BMW:   return new LittleClass() ;

        case AUDI:  return new Child2() ;

        DEFAULT: return new BigClass();
     }
  }
}

要使用它:

BigClass obj = factory.getInstance(AUDI); obj.getPerformanceIndicators();

© www.soinside.com 2019 - 2024. All rights reserved.