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
的方法,该方法采用2
String
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()
of
department
overloads
getEmployeeDetails()
of
Employee