有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

继承由于这个多态性的基本示例中的语法有什么不同吗?(爪哇)

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

像这样实例化子类会有什么不同吗:

BigClass myNewClass = new LittleClass();

或者这个:

LittleClass myNewClass = new LittleClass();

我可以理解为什么第一个会更有用,因为你可以在一行ect中声明许多不同的子类,但是除此之外还有什么区别吗


共 (6) 个答案

  1. # 1 楼答案

    BigClass引用只能访问BigClass功能,而不管它在何处实现(例如BigClassLittleClass)。换句话说,如果LittleClass有一个方法没有重写来自BigClass的内容,那么就不能使用BigClass引用调用它

  2. # 2 楼答案

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

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

    在这种情况下,myNewClass.DoEverything()仅在第二种情况下才合法(引用变量为LittleClass()类型)

  3. # 3 楼答案

    区别仅在第一种情况下存在

    BigClass myNewClass = new LittleClass();
    

    你只能使用

    myNewclass

    对象访问属于超类的方法

  4. # 4 楼答案

    第一个很有用,因为可以使用基类处理程序实现多态行为。如果您知道基类处理程序将始终仅具有此派生类对象,则具有基类或派生类的处理程序并没有多大区别

    另一个区别是基类处理程序不能访问在派生类中实现的非抽象方法

  5. # 5 楼答案

    在运行时没有区别(在你的意思上)。在这两种情况下,myNewClass变量都指向类型为LittleClass的对象。如果派生类(LittleClass)显式重写它们,则对其调用的任何方法都将在派生类(LittleClass)中执行。如果没有,它们将在超类中搜索/调用,如果不是在其超类中,依此类推

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

  6. # 6 楼答案

    一个例子是工厂设计模式: 在工厂模式中,您将拥有一个方法,该方法根据用户的需要创建各种子类,并在本例中返回类型为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=工厂。getInstance(奥迪); obj。getPerformanceIndicators()