我有一个名为Hospital.java的界面
Options +FollowSymlinks
RewriteEngine on
RewriteBase /
RewriteCond %{REQUEST_URI} [NC]
RewriteRule ^(.*)$ /$1?lang=EN [L]
我有一个名为StreetHospital.java的抽象类
public interface Hospital {
public void operate();
public void doScan();
public void doVaccination();
}
现在我正在使用另一个类CommunityHospital.java来扩展StreetHospital.java
public abstract class StreetHospital implements Hospital{
public void operate(){
System.out.println("Street Hospital operate");
}
}
我正在MainHospital类中创建CommunityHospital对象
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");
}
}
我收到了这个输出:
public class MainHospital {
public static void main(String[] args){
CommunityHospital ch = new CommunityHospital();
ch.operate();
ch.doScan();
ch.doVaccination();
}
}
我的问题是如何打印"街道医院运营"输出中的sysout语句?
答案 0 :(得分:5)
你不能这样做。
在一个具有相同名称和参数的类中不能有两种方法。一旦你在CommunityHospital中覆盖了operations(),StreetHospital中的同一个方法就不再存在了。
答案 1 :(得分:2)
您需要使用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
}
}
我建议您查看here了解更多详情并了解其概念。
如果你的方法覆盖了它的一个超类的方法,你可以 通过使用关键字 super 。
来调用重写的方法
答案 2 :(得分:1)
一种方法是从operate
类中删除CommunityHospital
方法。
在设计方面,这意味着社区医院的运作与街道医院的运作没有区别。
另一个考虑因素是你实际上想要街道医院的运作,然后在社区医院的运作中需要完成一些具体细节。对于CommunityHospital
operate
函数应该如下所示:
public void operate() {
super.operate(); //Street hospital operate
// Add community hospital operate details here
}
答案 3 :(得分:1)
您正在扩展一个类,但随后会覆盖其方法。因此,无论何时拨打operate
,都会使用CommunityHospital
中覆盖的operate
。如果删除它,它会从StreetHospital
类中找到operate
方法。
如果出于某种原因,您需要在CommunityHospital
中使用super.operate()
方法,请不要实施新方法,只需拨打StreetHospital
即可。这将调用operate
类“{{1}}方法。
答案 4 :(得分:1)
社区医院会覆盖操作方法,因此如果该类没有调用超级,那么就不可能......
修改类如:
p-column
答案 5 :(得分:1)
向CommunityHospital
添加另一个功能,其他名称为superOperate
,如下所示:
public void superOperate(){
super.operate();
}
并从任何地方拨打电话
答案 6 :(得分:1)
public void operate(){
super.operate(); // call the method from super class
}
或只是删除
@Override
public void operate() {
System.out.println("CommunityHospital operate");
}
表格社区医院
答案 7 :(得分:1)
如果您想以某种方式编写StreetHospital
,以便子类可以覆盖operate()
,而StreetHospital
' s operate()
(未覆盖的public abstract class StreetHospital implements Hospital {
public final void streetOperate() {
System.out.println("Street Hospital operate");
}
public void operate() {
streetOperate();
}
}
)仍然可以调用,你可以这样做:
operate()
现在可以覆盖streetOperate()
,但仍可以在任何CommunityHospital
对象或StreetHospital
的任何其他子类上调用obj.pos = [700, 700, 0]
。
但是,我真的很难想到一个实际情况,这将是一个很好的设计。
答案 8 :(得分:0)
您可以使用super
class CommunityHospital extends StreetHospital{
// same code
public void operate(){
super.operate(); //-> this line
//System.out.println("CommunityHospital operate");
}
}
如果您不想覆盖它,也可以制作operate
方法final
。
abstract class StreetHospital implements Hospital{
final public void operate(){
System.out.println("Street Hospital operate");
}
}
答案 9 :(得分:0)
只要您不覆盖操作方法,当您扩展它时,它将在您的班级中可用。
因此,在扩展时,不要覆盖班级中的操作方法。
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");
}
}
这应该有用。
答案 10 :(得分:0)
不幸的是,除了在子类中调用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
答案 11 :(得分:-2)
使用向下铸造的概念。 我已用C#编写代码
abstract class MyClass1 {
public void operate() {
System.Console.WriteLine("base class");
}
public abstract void operate1();
public virtual void operate2() {
System.Console.WriteLine("Virtual");
}
}
class myclass2 : MyClass1 {
public override void operate1() {
Console.WriteLine("Success");
}
public override void operate2() {
Console.WriteLine("overidden");
}
public new void operate() {
Console.WriteLine("!base class");
}
}
class program {
static void Main(string[] args) {
MyClass1 m = new myclass2();
m.operate();
}
}