非抽象类中的抽象方法

时间:2018-08-01 14:11:33

标签: java

例如,如果有:

class Person {
  // public void printInfos(){ }
}

class Student extends Person {
     public void printInfos(){
          System.out.println("studentInfos");
     }
}

class Teacher extends Person(){
     public void printInfos(){
          System.out.println("teacherInfos");
     }
}

main:
Person p1 = new Student();
Person p2 = new Teacher();

我想写:p1.printInfos()和p2.printInfos()并打印“ studentInfos”和“ teacherInfos”,但是除了在类Person中声明一个空方法外,我找不到其他解决方案(因为我们可以请勿将其声明为抽象并覆盖它,否则将无法实例化。 我觉得即使有效,声明一个空方法也是错误的。

2 个答案:

答案 0 :(得分:2)

您应该完全声明Person作为接口。从逻辑上讲,Person不应实例化。在这种情况下,定义新类和空体方法是多余的。

如果您坚持使用gobbledygook方法,除了定义新类之外,没有其他明智的方法。

interface Person {
   public void printInfos();
}

class Student implements Person {
     @Override
     public void printInfos(){
          System.out.println("studentInfos");
     }
}

class Teacher implements Person {
     @Override
     public void printInfos(){
          System.out.println("teacherInfos");
     }
}

main:
Person p1 = new Student();
Person p2 = new Teacher();

答案 1 :(得分:0)

请告诉我更多关于您对这堂课的需求。是否有充分的理由为什么要创建Person实例? 如果不是这样的话,那显然对我来说是一个抽象类,我想您应该将它抽象化。

您仍然可以选择声明构造函数,某些方法是子类的“默认”方法(为它们提供实现),并使printInfos成为抽象方法。

abstract class Person {
    abstract void printInfos();
}

class Student extends Person {
    public void printInfos(){
        System.out.println("studentInfos");
    }
}

class Teacher extends Person{
public void printInfos(){
        System.out.println("teacherInfos");
        }
        }