【问题标题】:How can I call a subclass method?如何调用子类方法?
【发布时间】:2016-05-04 11:27:53
【问题描述】:

如果这一行需要保持不变,我如何调用子类方法 work():

Employee secretary = new Secretary();

public class Employee {
}

public class Secretary extends Employee {
     public void work() {};
}

public static void main(String[] args) {
     Employee secretary = new Secretary();
     //secretary.work(); 
} 

【问题讨论】:

  • 如果您需要在Employee 上调用work 方法,您最好确保Employee 方法具有work 方法。目前,您最好只说Secretary secretary = new Secretary()
  • 感觉像是一道作业题……
  • 你的Secretary 甚至没有扩展Employee

标签: java oop inheritance subclass


【解决方案1】:

您的秘书类必须扩展 Employee

public static class Employee {
}

public static class Secretary extends Employee{
     public void work() {
     }
}

public static void main(String[] args) {
     Employee secretary = new Secretary();
     ((Secretary)secretary).work(); 
} 

因为secretary被声明为Employee,你不能调用Secretary类的方法,你需要转换它:

((Secretary)secretary).work(); 

这将告诉编译器您的secretarySecretary 类型的Employee,然后您将能够调用work() 方法。

【讨论】:

    【解决方案2】:

    如果父类必须知道 API 方法,那么扩展类有什么用?这违背了抽象的概念(这意味着您需要在声明为父类型的变量上调用方法)

    在父类中声明work()方法,使类抽象并在子类中实现它是有意义的。

    public abstract class Employee {
        public abstract void work();
    }
    
    public class Secretary extends Employee {
        public void work() {
             //Implement here...
        };
    }
    
    public static void main(String[] args) {
        Employee secretary = new Secretary();
        //secretary.work(); 
    } 
    

    【讨论】:

      【解决方案3】:

      当你说Secretary extends Employee 意味着Secretary 将在Employee 中包含所有公共和受保护的东西所以,不要指望你会在Employee 类型的对象中得到所有东西。

      你可以这样做

      public abstract class Employee {
          public abstract void work();
      }
      
      public class Secretary extends Employee {
          public void work() {
               //Implement here...
          };
      }
      

      interface Stuff{
          void work();
      }
      
      class Employee implements Stuff{
      
          @Override
          public void work() {
      
          }
      }
      
      class Secretary extends Employee {
           public void work() {}
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-05-13
        • 2011-12-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多