在Java中重写(overwriting)的方法

时间:2020-02-23 14:35:27  来源:igfitidea点击:

如果子类具有与基类相同的方法,那么它被称为 method overriding或者用另一个词,如果子类别向父母类中存在的任何方法提供特定的方法,那么它被称为 method overriding让我们从一个实时例子:

在一个小组织中,有两种员工例如: ManagerDeveloper
现在我们想打印员工的薪水。

在org.igi.theitroad中创建类员工.java

Employee.java

package org.igi.theitroad;
 
public class Employee { 
    int employeeId;
    String employeeName;
    double salary;
 
    public Employee(int employeeId, String employeeName, double salary) {
        super();
        this.employeeId = employeeId;
        this.employeeName = employeeName;
        this.salary = salary;
    }
 
    public int getEmployeeId() {
        return employeeId;
    }
    public void setEmployeeId(int employeeId) {
        this.employeeId = employeeId;
    }
    public String getEmployeeName() {
        return employeeName;
    }
    public void setEmployeeName(String employeeName) {
        this.employeeName = employeeName;
    }
    public double getSalary() {
        return salary;
    }
    public void setSalary(double salary) {
       this.salary = salary;
    }
}

Manager.java:

package org.igi.theitroad;
 
public class Manager extends Employee{
 
    public static final double BONUSPERCENT=0.2;
    public Manager(int employeeId, String employeeName, double salary) {
        super(employeeId, employeeName, salary);
    }
    public double getSalary() {
        return salary+salary*BONUSPERCENT;
    }
}

Developer.java:

package org.igi.theitroad;
public class Developer extends Employee{ 
    public static final double BONUSPERCENT=0.1;
 
    public Developer(int employeeId, String employeeName, double salary) {
        super(employeeId, employeeName, salary);        
    }
 
    public double getSalary() {
 
        return salary+salary*BONUSPERCENT;
    }
}

MethodOverridingMain:

package org.igi.theitroad;
 
public class MethodOverridingMain {
 
    /**
     * @author igi Mandliya
     */
    public static void main(String[] args) {
        Developer d1=new Developer(1,"igi" ,20000);
        Developer d2=new Developer(2,"John" ,15000);
        Manager m1=new Manager(1,"Amit" ,30000);
        Manager m2=new Manager(2,"Ashwin" ,50000);
 
        System.out.println("Name of Employee:" +d1.getEmployeeName()+"---"+"Salary:"+d1.getSalary());
        System.out.println("Name of Employee:" +d2.getEmployeeName()+"---"+"Salary:"+d2.getSalary());
        System.out.println("Name of Employee:" +m1.getEmployeeName()+"---"+"Salary:"+m1.getSalary());
        System.out.println("Name of Employee:" +m2.getEmployeeName()+"---"+"Salary:"+m2.getSalary());
    }
}

运行它:当我们将运行MethodoverRiddingMain.java.you将获取以下输出:

员工姓名:igi-SALARY:22000.0员工姓名:John-Salary:16500.0雇员姓名:AMIT薪水:36000.0员工名称:Ashwin-Salary:60000.0

正如我们在这里看到的,我们在开发人员和经理中重写(overwriting)了员工类的GetsAlary()方法。
为什么我们需要重写(overwriting)Getsalary()?
因为我们需要基于类的GetSalary()方法的特定实现。
例如Developer Class和Manager类具有不同的奖励,因此我们需要不同的实现。

方法重写(overwriting)的规则

|参数|绝不能改变|
| --- - | --- |
|返回类型|除了协变量(亚型)返回之外无法改变|
|访问修改器|不得更具限制性。可以减少限制性。 |
|例外|可以减少或者消除但不能抛出新的/更广泛的检查异常|
|构造函数|不能过度重写(overwriting)|
|静态方法|不能过度重写(overwriting)|
|最终方法|不能过度重写(overwriting)|

现在,我会回答你可以拥有的一些明显的问题:

问题

为什么你不能让访问修饰者更具限制性(例如,公共到私有)?

它是OOP中的一个基本原则:子类是父类的完全成熟的实例,因此必须至少与父类相同的接口。
不那么可见会违反这个想法;我们可以使子类无法作为父类的实例。
让我们在举例的帮助下看:

class Employee{
 public double getSalary(){
      //some operation
    }
 }
 
 
class Developer extends Employee{
   private double id getSalary(){
       //some operation
   }
 }

现在我可以使用:

Employee e1=new Developer();
e1.getSalary();

因此,即使我们制作了Developer Private的GetSalary()方法,我们也能够使用员工(超级类)的参考访问开发人员的GotsAlary()方法,即使我们已私密。
因此,在重写(overwriting)方法时无法减少访问修改器。

为什么你不能重写(overwriting)静态方法?

因为静态方法与对象的类无关,所以我们可以在子类中声明静态方法,但与父类无关。
它是隐藏不重写(overwriting)的方法。

你能重写(overwriting)私有方法吗?

不,你不能。
无法重写(overwriting)私有方法,因为它是从任何其他类中都不可见的。
我们可以为子类声明一个与超类方法无关的新方法。
所以它不是方法重写(overwriting)。

为什么你不能重写(overwriting)最终方法?

因为最终的方法是不重写的。
我们声明了一个方法决定,因为我们不希望它在子类中被重写(overwriting)。

如果我们改变参数的数量怎么办?

如果我们更改参数的数量,那么方法将重新载载不重写(overwriting)。
父类方法和子类方法应具有相同的方法签名。

什么是动态绑定?

在运行时发生重写方法的绑定被称为动态绑定。

Super关键词

Super关键字可用于从子类调用特定的父类方法。

例如:

package org.igi.theitroad;
 
public class Employee{
 public double getSalary(){
  System.out.println("In Employee class getSalary() method");
  return 0;
 }
 
 public static void main(String args[])
 {
  Developer d1=new Developer();
  d1.getSalary();
 }
}
 
 
class Developer extends Employee{
 public double getSalary(){
               //calling parent class method
  super.getSalary();
  System.out.println("In Developer class getSalary() method");
  return 0;
 }
}

运行程序时,我们将获取以下输出:

In Employee class getSalary() method
In Developer class getSalary() method