Java 理解压倒一切的概念
我有两个班,Java 理解压倒一切的概念,java,Java,我有两个班,员工和部门 部门是员工的子类 代码如下: 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 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调用子类
为什么会出现这种情况?部门的getEmployeeDetails()
不会覆盖员工的getEmployeeDetails()
,因为它有不同类型的参数(一个取2字符串
s,另一个取字符串
和int
)。这就是为什么e1.getEmployeeDetails(“Manish”,“10”)
调用基类Employee
的方法,该方法采用2String
s
另一方面,Department
的print()
确实覆盖了Employee
的print()
,因为它具有相同的签名。因此,执行部门的print()
。您对getEmployeeDetails
方法的方法签名不同。由于您提供了两个字符串作为参数,因此会调用超类方法,因为Department
类没有具有此类签名的方法(它只有一个具有字符串和int参数)
print
方法被正确重写,因为它具有相同的方法签名(方法名称、参数及其类型)。因此,它在部门类上被调用。重写一个方法应该尊重签名,这意味着方法名称和参数类型应该相同。注意:您返回的类型不会影响它
在您的子类中,您没有重写父方法。如果您想理解重写概念,如您的问题标题所示,那么您需要理解继承。这个例子(在员工
和部门
之间创建继承关系)没有反映出这样的理解,因此您确实需要后退一步
类似于Manager
的内容可以是Employee
的子类,因为每个经理都是员工
部门
可以是类似于组织单元
的子类,因为每个部门都是一个组织单元
但是一个部门不是一名员工,所以按照您所展示的方式使用extends没有概念上的意义;因此,在概念层面上,这个例子不能用来解释覆盖
要理解重写机制,可以使用此示例。在这种情况下,出现这种行为的原因是,子类方法仅在接受相同的参数类型时才重写超类方法。使用getEmployeeDetails()
的是方法重载-getEmployeeDetails方法的两个名称相同但参数列表不兼容的方法不会被重写,因为其参数不同。
重写的规则是,方法签名必须与此处的情况不同
此外,您还应该阅读有关动态方法分派的内容,该功能告诉您,在运行时,将决定调用哪个方法(父方法还是子方法)
例如:
1) 对于以下内容,它将调用Department类的方法,因为实例是Department类,即使实例变量是Employee类:
Employee e1 = new Department();
e1.getEmployeeDetails("Manish", "10");
e1.print();
Employee e1 = new Employee();
e1.getEmployeeDetails("Manish", "10");
e1.print();
2) 在以下情况下,它将调用Employee类的方法:
Employee e1 = new Department();
e1.getEmployeeDetails("Manish", "10");
e1.print();
Employee e1 = new Employee();
e1.getEmployeeDetails("Manish", "10");
e1.print();
希望这能消除你的疑虑;) 如果你让部门
扩展员工
,恐怕你对继承意味着什么有一个根本性的误解。最好读一本关于这个主题的好书。如果子类是基类的一个更具体的例子,那么应该使用extends
。例如,狗是动物的特例;因此,类狗
将是类动物
的逻辑扩展。但部门不是特定类型的员工;一个部门包含员工。这意味着它会过载,还是只适用于同一类中的方法?@reedb89是的,getEmployeeDetails()
ofdepartment
overloadsgetEmployeeDetails()
ofEmployee
。