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