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

时间:2014-01-16 00:17:50

标签: java inheritance polymorphism

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

以任何方式实现这样的子类是否有所不同:

BigClass myNewClass = new LittleClass();

或者这个:

LittleClass myNewClass = new LittleClass();

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

6 个答案:

答案 0 :(得分:0)

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

区别在于编译时。如果在下一行,您尝试仅调用由method定义的方法LittleClass(但不是BigClass),这将不会在第一个方案中编译,而是在第二个方案中编译。

答案 1 :(得分:0)

BigClass引用只能访问BigClass个功能,无论其实现位置如何(例如BigClassLittleClass)。换句话说,如果LittleClass的方法没有覆盖BigClass的某些内容,则无法使用BigClass引用进行调用。

答案 2 :(得分:0)

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

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

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

答案 3 :(得分:0)

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

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

答案 4 :(得分:0)

区别仅在于第一种情况

BigClass myNewClass = new LittleClass();

你只能使用

  

myNewclass

访问方法的对象属于超类。

答案 5 :(得分:0)

一个示例是Factory设计模式: 在工厂模式下,您将拥有一个根据用户需要创建各种子类的方法,在这种情况下,返回的类型将为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();