我有两个课程,Employee
和Department
。
Department
是Employee
的子类。
代码如下:
public class Employee {
public void getEmployeeDetails(String name , String age) {
System.out.println("Employee.getEmployeeDetails()");
}
public void print() {
System.out.println("Employee.print()");
}
}
public class Department extends Employee {
public void getEmployeeDetails(String name , int age) {
System.out.println("Department.getEmployeeDetails()");
}
public void print() {
System.out.println("Department.print()");
}
}
我正在运行以下代码。
public static void main(String[] args) {
Employee e1 = new Department();
e1.getEmployeeDetails("Manish", "10");
e1.print();
}
输出
Employee.getEmployeeDetails()
Department.print()
当我运行getEmployeeDetails()
方法时,JVM会调用父类,但是当我调用print()
方法时,JVM会调用子类。
为什么会这样发生?
答案 0 :(得分:4)
getEmployeeDetails()
的{p} Department
不会覆盖getEmployeeDetails()
的{{1}},因为它有不同类型的参数(一个需要2 Employee
s而另一个需要String
s需要String
和int
)。这就是e1.getEmployeeDetails("Manish", "10");
调用基类Employee
的方法的原因,该方法需要2 String
秒。
另一方面,print()
的{{1}}会覆盖Department
的{{1}},因为它具有相同的签名。因此,print()
Employee
被执行。
答案 1 :(得分:0)
getEmployeeDetails
方法的方法签名有所不同。由于您提供了两个字符串作为参数,因此调用了超类方法,因为Department
类没有带有这种签名的方法(它只有一个带有String和int参数的方法)。
print
方法正确 Overriden ,因为它具有相同的方法签名(方法名称,参数及其类型)。因此,它在Department
类上调用。
答案 2 :(得分:0)
覆盖方法应该尊重签名,这意味着方法名称和参数类型应该相同。注意:您要返回的类型不会影响它
在您的子课程中,您没有覆盖父方法。
答案 3 :(得分:0)
如果您想了解最重要的概念,因为您的问题的标题是,那么您需要了解继承。这个例子(在Employee
和Department
之间创建继承关系)并没有反映这种理解,所以你真的需要退后一步。
像Manager
这样的东西可能是Employee
的子类,因为每个经理都是雇员。
Department
可能是OrgUnit
之类的子类,因为每个部门都是一个组织单位。
但是一个部门不是一个雇员,所以在你展示的方式中使用extend是没有概念意义的;所以在概念层面,这个例子不能用于解释覆盖。
要理解覆盖的机制,此示例可用。在该上下文中,您看到的行为的原因是,如果子类方法接受相同的参数类型,则它只会覆盖超类方法。你对getEmployeeDetails()
所拥有的是方法重载 - 两个名称相同但参数列表不兼容的方法
答案 4 :(得分:0)
对于getEmployeeDetails方法,由于其参数不同,因此不会覆盖该方法。 覆盖规则是方法签名必须相同,而不是这里的情况。
此外,您应该阅读 动态方法调度 ,该功能告诉您在运行时决定调用哪个方法(父或子)。
例如:
1)对于下面它将调用Department类的方法,因为实例是Department类,即使实例变量是Employee类:
Employee e1 = new Department();
e1.getEmployeeDetails("Manish", "10");
e1.print();
2)在下面的例子中,它将调用Employee类的方法:
Employee e1 = new Employee();
e1.getEmployeeDetails("Manish", "10");
e1.print();
希望这能清除你的怀疑;)