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

我有一个名为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.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。我认为没有其他方法。因为您不能创建抽象类的实例,但可以创建它的引用变量。