Java 在子类中调用方法的正确方法,如果它';它被引用为一个超类

Java 在子类中调用方法的正确方法,如果它';它被引用为一个超类,java,subclass,superclass,Java,Subclass,Superclass,为了调用方法doStuff()我是否需要像(子类)aClass.doStuff()那样强制转换它 通常是这样做的吗 有更好的办法吗 我是否应该“总是”以这种方式初始化子类,以防我想放一堆 将超类的子类放入数组或类似的东西 更新: 在阅读了大家的回答之后: 嗯。我的理解中肯定遗漏了一些东西。我认为让一个子类继承超类的所有内容,然后在子类中再创建一个方法是可以的。那么我应该制作一个界面吗 此外,我还有超类class=newsubclass()但将其重命名为超类aClass=new SubClass(

为了调用方法
doStuff()
我是否需要像
(子类)aClass.doStuff()那样强制转换它

  • 通常是这样做的吗
  • 有更好的办法吗
  • 我是否应该“总是”以这种方式初始化子类,以防我想放一堆 将超类的子类放入数组或类似的东西
  • 更新: 在阅读了大家的回答之后:

    嗯。我的理解中肯定遗漏了一些东西。我认为让一个子类继承超类的所有内容,然后在子类中再创建一个方法是可以的。那么我应该制作一个界面吗

    此外,我还有
    超类class=newsubclass()
    但将其重命名为
    超类aClass=new SubClass()

  • 您的代码实际上不会工作,但是的,强制转换是实现这一点的唯一方法(但不要)。您需要做的是
    ((子类)class).doStuff()
  • 不,我建议不要这样做
  • 否。如果需要
    子类
    ,请将其声明为
    子类
    。如果您有一组对象,这些对象都继承自
    超类
    ,那么您应该调用的唯一方法就是那些在
    超类
    上定义的方法。做任何其他事情都会导致可怕的、像意大利面条一样无法维护的代码
  • 您的代码实际上不会工作,但是的,强制转换是实现这一点的唯一方法(但不要)。您需要做的是
    ((子类)class).doStuff()
  • 不,我建议不要这样做
  • 否。如果需要
    子类
    ,请将其声明为
    子类
    。如果您有一组对象,这些对象都继承自
    超类
    ,那么您应该调用的唯一方法就是那些在
    超类
    上定义的方法。做任何其他事情都会导致可怕的、像意大利面条一样无法维护的代码
  • 如果
    doStuff()
    只属于子类,在超类中没有意义,那么此时应该使用子类实例

    但是,如果
    doStuff()
    在超类的所有子类中都具有语义有效性,那么超类应该有一个在所有子类中实现的抽象方法
    doStuff()

    或者,如果
    doStuff()
    仅适用于某些子类,则可以使用该方法定义接口,并让这些子类实现该接口

    您使用哪种方法取决于整个应用程序结构,并且您还没有为我们提供足够的信息来进一步指导您。

    如果
    doStuff()
    只属于子类,在超类中没有任何意义,那么此时您应该使用子类实例

    但是,如果
    doStuff()
    在超类的所有子类中都具有语义有效性,那么超类应该有一个在所有子类中实现的抽象方法
    doStuff()

    或者,如果
    doStuff()
    仅适用于某些子类,则可以使用该方法定义接口,并让这些子类实现该接口


    您使用哪种方法取决于整个应用程序结构,您还没有提供足够的信息供我们进一步指导。

    我认为这一行可能无法编译

    class SuperClass () {
      doSuperStuff();
    }
    
    class SubClass extends SuperClass () {
      doStuff();
    }
    
    SuperClass aClass = new SubClass();
    
    但是,假设您有超类clazz=new SubClass();声明在编译时完成,方法的调用也在编译时完成。因此,您将只看到在声明clazz的类型上声明的方法。因此,如果需要调用子类方法,则需要对clazz执行适当的强制转换


    关于你的第二个问题:如果你想利用多态行为,这是正确的方法。。。这就引出了你的第三个问题。是的,这是一种利用多态性的方法,在存储在一个集合或一个用基类型声明的数组中之后,以统一的方式访问一堆子类的行为。我认为这一行可能不会编译

    class SuperClass () {
      doSuperStuff();
    }
    
    class SubClass extends SuperClass () {
      doStuff();
    }
    
    SuperClass aClass = new SubClass();
    
    但是,假设您有超类clazz=new SubClass();声明在编译时完成,方法的调用也在编译时完成。因此,您将只看到在声明clazz的类型上声明的方法。因此,如果需要调用子类方法,则需要对clazz执行适当的强制转换

    关于你的第二个问题:如果你想利用多态行为,这是正确的方法。。。这就引出了你的第三个问题。是的,这是一种利用多态性的方法,在存储在使用基类型声明的集合或数组中后,以统一的方式访问一组子类的行为
  • 首先,如果要从子类调用方法,首先不必使用超类的数据类型来创建变量。你可以简单地:

    SuperClass class = new SubClass();
    
  • obj1
    将能够从其超类(由于继承,超类中的私有方法除外)和自身访问这两个方法

    • 其次,不能将变量命名为
      class

    • 第三,如果你想做一个演员,它是这样的:

      MySubClass obj1 = new MySubClass();
      
        • 首先,如果要从子类调用方法,首先不必使用超类的数据类型来创建变量。你可以简单地:

          SuperClass class = new SubClass();
          
        obj1
        将能够从其超类(由于继承,超类中的私有方法除外)和自身访问这两个方法

        • 其次,不能将变量命名为
          class

        • 第三,如果你想做一个演员,它是这样的:

          MySubClass obj1 = new MySubClass();
          

        如果您需要调用
        SubCl