我想将书中的一些多态性示例分成几个文件,但是在创建类程序员和经理的对象emp1和emp2时,主类PoliWithClasses出错。请让我知道运行以下代码有什么问题
文件员工.java
package po;
abstract class Employee {
public void reachOffice() {
System.out.println("reached Office - India");
}
public abstract void startProject();
}
文件程序员.java
package po;
class Programmer extends Employee {
public void startProject(){
defineClasses();
unitTestCode();
}
private void defineClasses() {System.out.println("define classes");}
private void unitTestCode() {System.out.println("unit Test Code");}
}
文件管理器.java
package po;
class Manager extends Employee {
public void startProject() {
meetingWithCustomer();
defineProjectSchedule();
assignRespToTeam();
};
private void meetingWithCustomer() {System.out.println("meet Customer");}
private void defineProjectSchedule() {System.out.println("define Project Schedule");}
private void assignRespToTeam() {System.out.println("assign Resp To Team");}
}
File PoliWithClasses.java
package po;
public class PoliWithClasses {
public static void main(String arg[]) {
}
Employee emp1=new Programmer();
Employee emp2=new Manager();
emp1.reachOffice();
emp2.reachOffice();
emp1.startProjectWork();
emp2.startProjectWork();
}
谢谢,我已经纠正了拼写错误,但看起来这些对象在主类中仍然不可见:
emp1.reachOffice();
emp2.reachOffice();
emp1.startProject();
emp2.startProject();
您对给定错误消息的评论表明这是实际问题:
public class PoliWithClasses {
public static void main(String arg[]) {
//} <-- your bracket was here
Employee emp1=new Programmer();
Employee emp2=new Manager();
emp1.reachOffice();
emp2.reachOffice();
emp1.startProject(); // use consistent names
emp2.startProject();
} // the code must be contained in the method
}
总结一下:
- 您发现的第一个问题是主代码中不正确的方法调用。这不是与多态性有关的问题,因为子类中
startProject
的方法原型与Employee
中的方法原型匹配。 - 您希望执行的实际代码不在
main
范围内。emp1
和emp2
的声明被解释为包范围的字段声明。但是,emp1.reachOffice()
和emp2.reachOffice()
在方法实现之外都是非法的。
我还将添加一个建议:每次在子类中重写方法时都使用 @Override 注释(它确保发生了覆盖)。例如,在Programmer
类中:
class Programmer extends Employee {
@Override
public void startProject(){
defineClasses();
unitTestCode();
}
// ...
}
你的代码有错误。不:
emp1.startProjectWork();
emp2.startProjectWork();
但:
emp1.startProject();
emp2.startProject();