如何调用抽象class方法
How to call abstract class method
我有一个名为 Hospital.java
的界面
public interface Hospital {
public void operate();
public void doScan();
public void doVaccination();
}
我有一个名为 StreetHospital.java
的摘要 class
public abstract class StreetHospital implements Hospital{
public void operate(){
System.out.println("Street Hospital operate");
}
}
现在我正在使用另一个class社区Hospital.java来扩展街道Hospital.java
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 对象 class
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 语句?
一种方法是从 CommunityHospital
class 中删除 operate
方法。
就设计而言,这意味着社区医院的运作与街道医院的运作没有区别。
另一个考虑因素是您实际上想要街道医院的运作,然后社区医院的运作需要完成一些细节。对于 CommunityHospital
operate
函数应该如下所示:
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
}
}
我建议您查看 here 了解更多详情并理解概念。
If your method overrides one of its superclass's methods, you can
invoke the overridden method through the use of the keyword super.
您正在扩展 class,但随后覆盖了它的方法。因此,每当您调用 operate
时,它都会使用 CommunityHospital
中被覆盖的那个。如果删除它,它将从 StreetHospital
class.
中找到 operate
方法
如果出于某种原因您确实需要 CommunityHospital
中的 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");
}
}
如果您不想覆盖它,您也可以将 operate
方法设为 final
。
abstract class StreetHospital implements Hospital{
final public void operate(){
System.out.println("Street Hospital operate");
}
}
你不能那样做。
一个class中不能有两个具有相同名称和参数的方法。在 CommunityHospital 中重写 operate() 后,StreetHospital 中的相同方法将不再存在。
CommunityHospital 覆盖了 operate 方法,因此如果 class 不调用 super 则不可能...
将 class 修改为:
public void operate(){
super.operate(); // call the method from super class
}
向 CommunityHospital
添加另一个函数,使用另一个名称说 superOperate
,像这样:
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");
}
成立社区医院
如果您想以一种方式编写 StreetHospital
以便子类可以覆盖 operate()
,但是 StreetHospital
的 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
的任何其他子类上调用。
但是,我真的很难想出这样的设计是一个好的实际案例。
只要您不重写 operate 方法,当您扩展它时,它就会在您的 class 中可用。
因此,在扩展 class 时不要重写操作方法。
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#写了代码
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();
}
}
不幸的是,除了在子类中调用 super.operate
之外别无他法。
java 中的向上转换不起作用。显示它的演示:
package com.Whosebug.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
我有一个名为 Hospital.java
的界面public interface Hospital {
public void operate();
public void doScan();
public void doVaccination();
}
我有一个名为 StreetHospital.java
的摘要 classpublic abstract class StreetHospital implements Hospital{
public void operate(){
System.out.println("Street Hospital operate");
}
}
现在我正在使用另一个class社区Hospital.java来扩展街道Hospital.java
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 对象 class
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 语句?
一种方法是从 CommunityHospital
class 中删除 operate
方法。
就设计而言,这意味着社区医院的运作与街道医院的运作没有区别。
另一个考虑因素是您实际上想要街道医院的运作,然后社区医院的运作需要完成一些细节。对于 CommunityHospital
operate
函数应该如下所示:
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
}
}
我建议您查看 here 了解更多详情并理解概念。
If your method overrides one of its superclass's methods, you can invoke the overridden method through the use of the keyword super.
您正在扩展 class,但随后覆盖了它的方法。因此,每当您调用 operate
时,它都会使用 CommunityHospital
中被覆盖的那个。如果删除它,它将从 StreetHospital
class.
operate
方法
如果出于某种原因您确实需要 CommunityHospital
中的 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");
}
}
如果您不想覆盖它,您也可以将 operate
方法设为 final
。
abstract class StreetHospital implements Hospital{
final public void operate(){
System.out.println("Street Hospital operate");
}
}
你不能那样做。
一个class中不能有两个具有相同名称和参数的方法。在 CommunityHospital 中重写 operate() 后,StreetHospital 中的相同方法将不再存在。
CommunityHospital 覆盖了 operate 方法,因此如果 class 不调用 super 则不可能...
将 class 修改为:
public void operate(){
super.operate(); // call the method from super class
}
向 CommunityHospital
添加另一个函数,使用另一个名称说 superOperate
,像这样:
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");
}
成立社区医院
如果您想以一种方式编写 StreetHospital
以便子类可以覆盖 operate()
,但是 StreetHospital
的 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
的任何其他子类上调用。
但是,我真的很难想出这样的设计是一个好的实际案例。
只要您不重写 operate 方法,当您扩展它时,它就会在您的 class 中可用。
因此,在扩展 class 时不要重写操作方法。
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#写了代码
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();
}
}
不幸的是,除了在子类中调用 super.operate
之外别无他法。
java 中的向上转换不起作用。显示它的演示:
package com.Whosebug.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