以前JAVA看的少,最近做项目,对@Override的调用顺序有点疑惑,故查了一些资料。既然查资料了,那就把能看到的知识点整理一下,以供日后学习。

原文地址请保留http://www.cnblogs.com/rossoneri/p/3977038.html

关于重写

当一个子类继承一父类,而子类中的方法与父类中的方法的名称,参数个数、类型都完全一致时,就称子类中的这个方法重写了父类中的方法。通常,派生类继承基类的方法,因此,在调用对象继承方法的时候,调用和执行的是基类的实现.但是,有时需要对派生类中的继承方法有不同的实现.
例如,假设动物类存在"跑"的方法,从中派生出马和狗,马和狗的跑得形态是各不相同的,因此同样方法需要两种不同的实现,这就需要"重新编写"基类中的方法。"重写"基类方法就是修改它的实现或者说在派生类中重新编写。

重写是子类与父类的一种多态性体现。
重写允许子类改变父类的一些行为,当父类不满足子类的一些要求时我们就需要子类对父类的一些行为进行重写。

重写示例

例如:某公司里的员工的电话号码不允许对外公开,而销售人员(员工)的电话号码则需要对外公开。

 public class Employee {

     private String mobile;

     public Employee(String mobile) {
this.mobile = mobile;
} protected String showMess(){
return "电话号码:"+mobile;
}
}

员工类的showMess方法是protected的,所以位于其他包的对象是访问不到的。

然后定义一个销售人员的类(Sales),并继承Employee类

 public class Sales extends Employee{

         //子类除了具有父类的一些属性,也可以有自己的一些属性
private String msn; public Sales(String mobile,String msn) {
super(mobile);
this.msn = msn;
} @Override
public String showMess() {
return super.showMess()+"==msn:"+this.msn;
}
}

注意这时被覆盖的showMess方法的访问级别是public,可以被任何其他对象访问到。

关键点

1.被覆盖方法的访问控制级别可以不一样。

例如上例父类的showMess方法的访问级别为protected的,而子类覆盖的showMess方法访问级别则为public的。
但子类的访问级别必须要高于父类被覆盖方法的访问级别,如果父类是public的而子类是protected的则是错误的。

2.方法被定义为private或static或final的则不能被覆盖。

3.方法的返回类型。

前面说了,重写的方法名称,参数及类型必须一致,但没有提返回类型。这里,返回类型可以不一样,但类型有限制。

子类的返回类型可以是更具体的对象,例如可以将Employee类的返回类型改为Object也正确。而倒过来则错误。

4.在方法调用时先会在子类中找覆盖的方法,如果子类中没有则会在父类中去找。


调用顺序示例

 public class Parent {

     private int num(int i,int j){
return i+j;
} public static void main(String[] args) {
Parent p = new Child();
System.out.println(p.num(1, 2));
}
}
class Child extends Parent{ public int num(int x,int y){
return x-y;
}
}

这段代码的执行结果为什么呢?如果你回答-1则错了,正确答案是3。
为什么呢?因为父类的num方法是private的,所以不能被覆盖,所以子类的num方法不是一种Override,因此在子类找不到被覆盖的num方法就会执行父类的num方法。所以结果输出为3.如果把private改为protected或者public结果就是-1了

 public class Parent {

     public int test(){
//执行子类的num方法
return num(1,2);
} protected int num(int i,int j){
return i+j;
} public static void main(String[] args) {
Parent p = new Child();
System.out.println(p.test());
} }
class Child extends Parent{ public int num(int x,int y){
return x-y;
}
}

那么这段代码的执行结果是-1,因为父类test方法调用的是子类的num方法。

再看下一个例子,先写一个基类:

 package tttttest;

 public class Fruit {
public void show_name(int num) {
System.out.println("Fruit: " + num);
} public static void main(String[] args) {
// TODO code application logic here
Fruit apple = new Apple();
apple.show_name(2);
}
}

之后我们编写一个Apple子类,继承这个基类。并且复写基类中的show_name()方法。

 package tttttest;

 public class Apple extends Fruit{

     @Override
public void show_name(int num) {
// TODO Auto-generated method stub
System.out.println("Apple: " + num);
} }

输出结果就是Apple: 2

关于@Override标签

@Override是伪代码,表示重写

一来可以当作注释来看

二来增加代码的可读性,看到标签就知道这是从父类重写的方法

三来,就是IDE会根据这个标签来检查你的代码。如果你写代码的时候不太注意重写规范,犯了上面写的4个关键点的错误还没发现,你若加上这个标签,IDE便会帮你标记错误。

怎么让IDE自动加@Override标签

我用Eclipse的添加方法是:在editor中单击鼠标右键->Source->Override/Implement Methods

在列表中选择需要重写的方法即可。

参考资料

java多态之Override

分享一下@Override标签背后的小秘密---记录java的思行合一

[JAVA] 重写以及@Override标签的更多相关文章

  1. java中的@Override标签

    @Override标签的作用: @Override是伪代码,表示方法重写. @Override标签的好处: 1.作为注释,帮助自己检查是否正确的复写了父类中已有的方法 2.便于别人理解代码 3.编译器 ...

  2. java中的@Override标签,小细节大作用

    转载:http://www.cnblogs.com/octobershiner/archive/2012/03/09/2388370.html 一般用途                         ...

  3. Java - 21 Java 重写(Override)与重载(Overload)

    Java 重写(Override)与重载(Overload) 重写(Override) 重写是子类对父类的允许访问的方法的实现过程进行重新编写!返回值和形参都不能改变.即外壳不变,核心重写! 重写的好 ...

  4. java中重载(overload)与重写(override)的区别

    方法重载(overload): 方法重载就是在一个类中可以创建多个方法,它们具有相同的名字,但是具有不同的参数和不同的定义,调用方法时通过传递给它们的不同参数个数和参数类型来决定具体使用哪个方法,这就 ...

  5. “全栈2019”Java第四十八章:重写方法Override

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

  6. JAVA重写不需要@override

    一,如下代码, package com.boot.enable.bootenable; import org.springframework.scheduling.annotation.Async; ...

  7. java 中重载(Overload)和重写(Override)的区别

    首先重载和重写是应用于两个不同场景下面的两种不同的手段: 两者各自的特征: 重载(Overload):首先是位于一个类之中或者其子类中,具有相同的方法名,但是方法的参数不同,返回值类型可以相同也可以不 ...

  8. Java重写toString和泛型的使用

    一.在一个类中重写toString方法 public class Person { private String name; private int age; public Person() { } ...

  9. Java overload和override的区别分析

    Java overload和override的区别分析 方法的重写(Overriding)和重载(Overloading)是Java多态性的不同表现.重写(Overriding)是父类与子类之间多态性 ...

随机推荐

  1. rpm安装JDK方法

    由于版权原因,Linux发行版并没有包含官方版的Oracle JDK,必须自己从官网上下载安装.Oracle官网用Cookie限制下载方式,使得眼下只能用浏览器进行下载,使用其他方式可能会导致下载失败 ...

  2. crontab命令使用文档.txt

    基本格式 : * * * * * command 分 时 日 月 周 命令 第1列表示分钟1-59 每分钟用*或者 */1表示 第2列表示小时1-23(0表示0点) 第3列表示日期1-31 第4列表示 ...

  3. Stack Overflow 2016 最新架构探秘

    原文:http://nickcraver.com/blog/2016/02/17/stack-overflow-the-architecture-2016-edition/ 转载:http://www ...

  4. 解决docker镜像无法下载的问题

    从daocloud.io中找到了获取镜像的方式,在镜像仓库中可以找到镜像的地址,其他镜像地址可以以此类推: # docker pull daocloud.io/library/centos:lates ...

  5. tsung压力测试——安装

    在安装之前确保安装了以下工具: erlang 必须要有安装java环境,要不然不成功 yum install gcc yum install gcc-c++ yum install libtool y ...

  6. postgresql 清空数据表数据

    在 mysql中,只需要执行: TRUNCATE table_name; 即可,数据会情况,而且自增id也会变回0: 但在 postgresql 则稍有不同,因为 postgresql 的自增id是通 ...

  7. 微信支付开发 c# SDK JSAPI支付开发的流程和微信大坑

    微信支付开发流程 1. 开通微信支付功能 省略 2. 下载微信的C#版的微信SDK 下载连接:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chap ...

  8. @JsonProperty和@JsonAlias的区别

    @JsonProperty这个注解提供了序列化和反序列化过程中该java属性所对应的名称@JsonAlias这个注解只只在反序列化时起作用,指定该java属性可以接受的更多名称 public stat ...

  9. js的浅复制和深复制

    1.浅复制VS深复制 本文中的复制也可以称为拷贝,在本文中认为复制和拷贝是相同的意思.另外,本文只讨论js中复杂数据类型的复制问题(Object,Array等),不讨论基本数据类型(null,unde ...

  10. 呼叫WCF Service的方法出现Method not allowed异常

    asp.net mvc练习程序,经常性在家里电脑,笔记本或是公司的电脑之间拷贝与粘贴,如果忘记携带最新的练习程序,一些小功能只能重新写了.如前一篇<ASP.NET MVC呼叫WCF Servic ...