如果它被引用为超类,则在子类中调用方法的正确方法

时间:2016-02-01 21:03:58

标签: java subclass superclass

class SuperClass () {
  doSuperStuff();
}

class SubClass extends SuperClass () {
  doStuff();
}

SuperClass aClass = new SubClass();

为了调用方法doStuff()我是否需要像(SubClass)aClass.doStuff();一样投射?

  1. 这通常是这样做的吗?
  2. 有更好的方法吗?
  3. 我应该"永远"以这种方式初始化SubClass,以防我想放一堆 SuperClass的子类到数组或类似的东西?
  4. 更新 在阅读了所有人的回复之后:

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

    此外,我有SuperClass class = new SubClass();但已将其重命名为SuperClass aClass = new SubClass();

4 个答案:

答案 0 :(得分:3)

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

    MySubClass obj1 = new MySubClass();
    

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

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

  • 第三,如果你想进行投射,它会是这样的:

    MySuperClass obj2 = new MySubClass();
    ((MySubClass)obj2).doStuff();
    

答案 1 :(得分:1)

  1. 您的代码实际上无法正常工作,但是铸造是实现此目的的唯一方法(但不是)。您需要做的是((SubClass)class).doStuff();
  2. 否。我建议不要这样做
  3. 否。如果您需要SubClass,请将其声明为SubClass。如果您拥有一组全部继承自SuperClass的对象,则应该调用的唯一方法是SuperClass上定义的方法。做其他任何事都会导致可怕的意大利面条像不可维护的代码

答案 2 :(得分:1)

如果doStuff()仅属于子类并且在超类中没有意义,那么你应该在那时使用子类实例。

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

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

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

答案 3 :(得分:0)

我认为这行可能无法编译

SuperClass class = new SubClass();

但是假设你有SuperClass clazz = new SubClass();声明在编译时完成,因此调用方法也是如此。因此,您将只看到在声明clazz的类型上声明的方法。所以,如果您需要调用子类方法,则需要在clazz上执行相应的强制转换。

关于你的第二个问题:如果你想利用多态行为,这是做事的正确方法......这引导我们回答你的第三个问题。是的,这是通过在存储于使用基类型声明的集合或数组中以一致的方式访问一堆子类的行为来利用多态的方法