第三章java中的方法覆盖|
如果子类与基类具有相同的方法,则称为method overriding
Or 换句话说,如果子类为其父类之一中存在的任何方法提供特定实现,则称为method overriding
让我们从一个实时示例开始:
在小型组织中,有两种员工,即Manager
和Developer
。现在我们要打印员工的工资。
在 org.arpit.java2blog 中创建类 Employee.java Employee.java
package org.arpit.java2blog;
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.arpit.java2blog;
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.arpit.java2blog;
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.arpit.java2blog;
public class MethodOverridingMain {
/**
* @author Arpit Mandliya
*/
public static void main(String[] args) {
Developer d1=new Developer(1,"Arpit" ,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());
}
}
运行它: 当你将运行 MethodOverridingMain.java。你将得到以下输出:
Name of Employee:Arpit—Salary:22000.0
Name of Employee:John—Salary:16500.0
Name of Employee:Amit—Salary:36000.0
Name of Employee:Ashwin—Salary:60000.0
正如您在此处看到的,我们在 Developer 和 Manager 中重写了 Employee 类的 getSalary() 方法。为什么我们需要重写 getSalary()? 因为我们需要基于 Class 的 getSalary() 方法的具体实现。例如 Developer 类和 Manager 类有不同的好处,所以我们需要对两者进行不同的实现。
方法覆盖的规则
Arguments | Must not change |
---|---|
Return type | Can’t change except for covariant (subtype) returns |
Access Modifier | Must not be more restrictive. Can be less restrictive. |
Exceptions | Can reduce or eliminate but must not throw new/broader checked exceptions |
Contructor | Can not be overriden |
Static method | Can not be overriden |
final method | Can not be overriden |
现在在这里,我将回答您可能提出的一些显而易见的问题:
问题
为什么不能使访问修饰符更具限制性(例如从公共到私人)?
这是 OOP 中的一个基本原则:子类是父类的完整实例,因此必须至少具有与父类相同的接口。不那么显眼会违反这个想法;您可以使子类无法用作父类的实例。 让我们借助示例来看看:
class Employee{
public double getSalary(){
//some operation
}
}
class Developer extends Employee{
private double id getSalary(){
//some operation
}
}
现在我可以调用使用:
Employee e1=new Developer();
e1.getSalary();
因此,即使您将开发人员的 getSalary() 方法设为私有,即使您已将其设为私有,您也可以使用 Employee(超类)的引用访问开发人员的 getSalary() 方法。所以你不能在覆盖方法时减少访问修饰符。
为什么不能覆盖静态方法?
因为静态方法与类相关而不是对象的状态,所以您可以在子类中声明静态方法,但它与父类无关。它是方法隐藏而不是覆盖。
你能覆盖私有方法吗?
不,你不能。私有方法不能被覆盖,因为它在任何其他类中都不可见。您可以为您的子类声明一个与超类方法无关的新方法。所以它不是方法覆盖。
为什么不能覆盖最终方法?
因为最终方法不应该被覆盖。您声明一个最终方法是因为您不希望它在子类中被覆盖。
如果我们改变参数的数量怎么办?
如果您更改参数的数量,那么它将是方法重载而不是覆盖。父类方法和子类方法应该具有相同的方法签名。
什么是动态绑定?
在运行时发生的重写方法的绑定称为动态绑定。
超级关键词
super 关键字可用于从子类调用特定的父类方法。
例如:
package org.arpit.java2blog;
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
这就是java中的方法覆盖。
相关文章:
- [其它]第六章JavaFutureTask示例|
- [其它]第六章JavaScheduledThreadPoolExecutor示例|
- [其它]第六章使用Callable和Future的JavaExecutorService示例|
- [其它]第六章JavanewCachedThreadPool示例|
- [其它]第六章JavanewFixedThreadPool示例|
- [其它]第五章在java中使用3个线程打印序列|
- [其它]第五章java中notify和notifyAll的区别|
- [其它]第五章我们可以在java中启动一个线程两次吗|
- [其它]第五章java中的对象级锁定与类级锁定|
- [其它]第五章Java线程连接示例|
相关推荐:
- [其它]第三章java中的抽象类|
- [其它]第四章java中的TreeMap与示例|
- [其它]第四章java中的hashcode()和equals()方法|
- [其它]第六章JavaFutureTask示例|
- [其它]计算机组成原理PDF扫描格式电子版百度云网盘下载
- [其它]程序设计语言概念(第9版)[Robert W. Sebesta]pdf格式电子版百度云网盘下载[53.8M]
- [其它]程序员必读之软件架构[Simon Brown]pdf格式电子版百度云网盘下载[41.6M]
- [其它]程序员的思维修炼 开发认知潜能的九堂课[Andy Hunt]pdf格式电子版百度云网盘下载
- [其它]程序员的职业素养[Robert C. Martin]pdf格式电子版百度云网盘下载[21.6M]
- [其它]程序员教程(第3版)[张淑平]pdf格式电子版百度云网盘下载[136.5M]
- 计算机组成原理PDF扫描格式电子版百度云网盘下载
- 硅谷之谜[吴军]pdf格式电子版百度云网盘下载[59.5M]
- 自选基金助手,一款Chrome扩展程序
- 七周七语言 理解多种编程范型[Bruce A. Tate]pdf格式电子版百度云网盘下载[9M]
- 系统集成项目管理工程师考试考眼分析与样卷解析(2014版)[软考新大纲研究组]
- 程序员面试金典(第5版)[Gayle Laakmann McDowell]pdf格式电子版百度云网盘下载[81.5M]
- 创业维艰 如何完成比难更难的事[Ben Horowitz]pdf格式电子版百度云网盘下载[65.3
- 程序员的思维修炼 开发认知潜能的九堂课[Andy Hunt]pdf格式电子版百度云网盘下载
- 图灵的秘密 他的生平、思想及论文解读[Charles Petzold]pdf格式电子版百度云网盘下
- OCP OCA认证考试指南全册:Oracle Database 11g(1Z0-051、1Z0-052、1Z0-053)[John Watson]pdf格式