理解压倒一切的概念

时间:2017-09-12 12:58:45

标签: java

我有两个课程,EmployeeDepartment

DepartmentEmployee的子类。

代码如下:

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会调用子类。

为什么会这样发生?

5 个答案:

答案 0 :(得分:4)

getEmployeeDetails()的{​​p} Department不会覆盖getEmployeeDetails()的{​​{1}},因为它有不同类型的参数(一个需要2 Employee s而另一个需要String s需要Stringint)。这就是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)

如果您想了解最重要的概念,因为您的问题的标题是,那么您需要了解继承。这个例子(在EmployeeDepartment之间创建继承关系)并没有反映这种理解,所以你真的需要退后一步。

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();

希望这能清除你的怀疑;)