Java 如何调用抽象类方法
我有一个名为Hospital.java的接口Java 如何调用抽象类方法,java,class,inheritance,abstract,core,Java,Class,Inheritance,Abstract,Core,我有一个名为Hospital.java的接口 public interface Hospital { public void operate(); public void doScan(); public void doVaccination(); } public abstract class StreetHospital implements Hospital{ public void operate(){ System.out.printl
public interface Hospital {
public void operate();
public void doScan();
public void doVaccination();
}
public abstract class StreetHospital implements Hospital{
public void operate(){
System.out.println("Street Hospital operate");
}
}
public class CommunityHospital extends StreetHospital{
public void doScan(){
System.out.println("CommunityHospital doScan");
}
public void doVaccination(){
System.out.println("CommunityHospital doVaccination");
}
public void operate(){
System.out.println("CommunityHospital operate");
}
}
我有一个名为StreetHospital.java的抽象类
public interface Hospital {
public void operate();
public void doScan();
public void doVaccination();
}
public abstract class StreetHospital implements Hospital{
public void operate(){
System.out.println("Street Hospital operate");
}
}
public class CommunityHospital extends StreetHospital{
public void doScan(){
System.out.println("CommunityHospital doScan");
}
public void doVaccination(){
System.out.println("CommunityHospital doVaccination");
}
public void operate(){
System.out.println("CommunityHospital operate");
}
}
现在我使用另一个类CommunityHospital.java来扩展StreetHospital.java
public interface Hospital {
public void operate();
public void doScan();
public void doVaccination();
}
public abstract class StreetHospital implements Hospital{
public void operate(){
System.out.println("Street Hospital operate");
}
}
public class CommunityHospital extends StreetHospital{
public void doScan(){
System.out.println("CommunityHospital doScan");
}
public void doVaccination(){
System.out.println("CommunityHospital doVaccination");
}
public void operate(){
System.out.println("CommunityHospital operate");
}
}
我正在MainHospital类中创建CommunityHospital对象
public class MainHospital {
public static void main(String[] args){
CommunityHospital ch = new CommunityHospital();
ch.operate();
ch.doScan();
ch.doVaccination();
}
}
我得到以下输出:
CommunityHospital operate
CommunityHospital doScan
CommunityHospital doVaccination
我的问题是如何在输出中打印“Street Hospital operate”sysout语句 一种方法是从
社区医院
类中删除操作
方法
就设计而言,这意味着社区医院的运营与街道医院的运营没有区别
另一个需要考虑的问题是,您实际上需要街道医院的运营,然后在社区医院的运营中需要完成一些细节。对于该社区医院
操作
功能应如下所示:
public void operate() {
super.operate(); //Street hospital operate
// Add community hospital operate details here
}
您需要使用
super
关键字来调用子类中的超类成员,如下所示:
public class CommunityHospital extends StreetHospital{
public void doScan(){
System.out.println("CommunityHospital doScan");
}
public void doVaccination(){
System.out.println("CommunityHospital doVaccination");
}
public void operate(){
super.operate();//call super class operate to get StreetHospital features
//If you want, you can add CommunityHospital features here
}
}
我建议你寻找更多的细节,理解这个概念
如果您的方法重写其超类的方法之一,则可以
通过使用关键字super调用重写的方法
您正在扩展一个类,但随后将覆盖其方法。因此,每当您调用
operate
时,它将使用CommunityHospital
中的一个,即被覆盖的一个。如果将其删除,它将从StreetHospital
类中找到operate
方法
如果出于某种原因,您确实需要
社区医院中的操作方法,请不要实现新方法,只需调用super.operate()
。这将调用StreetHospital
class'operate
方法。您可以使用super
class CommunityHospital extends StreetHospital{
// same code
public void operate(){
super.operate(); //-> this line
//System.out.println("CommunityHospital operate");
}
}
如果不想允许重写,也可以使操作
方法最终
abstract class StreetHospital implements Hospital{
final public void operate(){
System.out.println("Street Hospital operate");
}
}
你不能那样做
一个类中不能有两个名称和参数相同的方法。一旦您在CommunityHospital中重写operate(),StreetHospital中的相同方法将不再存在。CommunityHospital重写operate方法,因此如果该类不调用super,则不可能
请按如下方式修改该类:
public void operate(){
super.operate(); // call the method from super class
}
将另一个功能添加到社区医院
,使用另一个名称说超级手术
,如下所示:
public void superOperate(){
super.operate();
}
从任何地方打电话
public void operate(){
super.operate(); // call the method from super class
}
或者干脆移除
@Override
public void operate() {
System.out.println("CommunityHospital operate");
}
form Community Hospital如果您想以子类可以重写operate()
的方式编写StreetHospital
,但是仍然可以调用StreetHospital的operate()
(未重写的一个),您可以这样做:
public abstract class StreetHospital implements Hospital {
public final void streetOperate() {
System.out.println("Street Hospital operate");
}
public void operate() {
streetOperate();
}
}
现在可以重写operate()
,但是仍然可以对任何CommunityHospital
对象或StreetHospital
的任何其他子类调用streetooperate()
然而,我真的很难想象这是一个好设计的实际情况。只要您不重写operate方法,当您扩展它时,它将在您的类中可用
因此,在扩展类时,不要重写类中的operate方法
public class CommunityHospital extends StreetHospital {
public class CommunityHospital extends StreetHospital {
public void doScan() {
System.out.println("CommunityHospital doScan");
}
public void doVaccination() {
System.out.println("CommunityHospital doVaccination");
}
}
这将起作用。使用向下浇铸的概念。
我已经用C写了代码#
不幸的是,除了在子类中调用super.operate
,没有其他方法
在java中向上转换不起作用。演示程序显示:
package com.stackoverflow.main;
class A {
void operate() {
System.out.println("A");
}
}
class B extends A {
void operate() {
System.out.println("B");
}
}
public class Main {
public static void main(String[] args) {
A b = new B();
((A) b).operate();
}
}
印刷品:
B
从你的主要观点来看,你不能,因为它被覆盖了。在CommunityHospital
中,您可以调用super.operate()
。在CommunityHospital
类中的方法operate中使用super.operate()
。类CommunityHospital
正在重写该方法,因此没有其他方法,因为在一个类中不能有两个具有相同签名的方法。@i\u am\u zero它不必是第一行。(您可能会将其与构造函数中使用的super()
相混淆,这必须是第一个。)确实不确定您要实现什么,但您可以创建StreetHospital
的另一个子类,而不必自己实现operate
方法;例如,PrivateHospital扩展了StreetHospital
,然后对新类的对象调用operate
。@ajb yea right:)谢谢。。它起作用了。还有其他方法可以代替使用super关键字吗?@nsd访问父类方法的唯一方法是super。我认为没有其他方法。因为您不能创建抽象类的实例,但可以创建它的引用变量。