JAVA重写以及@Override标签

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

关于重写

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

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

重写示例

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

 1 public class Employee {
 2
 3     private String mobile;
 4
 5     public Employee(String mobile) {
 6         this.mobile = mobile;
 7     }
 8
 9     protected String showMess(){
10         return "电话号码:"+mobile;
11     }
12 }

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

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

 1 public class Sales extends Employee{
 2
 3         //子类除了具有父类的一些属性,也可以有自己的一些属性
 4     private String msn;
 5
 6     public Sales(String mobile,String msn) {
 7         super(mobile);
 8         this.msn = msn;
 9     }
10
11     @Override
12     public String showMess() {
13         return super.showMess()+"==msn:"+this.msn;
14     }
15 }

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

关键点

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

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

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

3.方法的返回类型。

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

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

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


调用顺序示例

 1 public class Parent {
 2
 3     private int num(int i,int j){
 4         return i+j;
 5     }
 6
 7     public static void main(String[] args) {
 8         Parent p = new Child();
 9         System.out.println(p.num(1, 2));
10     }
11 }
12 class Child extends Parent{
13
14     public int num(int x,int y){
15         return x-y;
16     }
17 }

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

 1 public class Parent {
 2
 3     public int test(){
 4                 //执行子类的num方法
 5         return num(1,2);
 6     }
 7
 8     protected int num(int i,int j){
 9         return i+j;
10     }
11
12     public static void main(String[] args) {
13         Parent p = new Child();
14         System.out.println(p.test());
15     }
16
17 }
18 class Child extends Parent{
19
20     public int num(int x,int y){
21         return x-y;
22     }
23 }

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

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

 1 package tttttest;
 2
 3 public class Fruit {
 4     public void show_name(int num) {
 5         System.out.println("Fruit: " + num);
 6     }
 7
 8     public static void main(String[] args) {
 9         // TODO code application logic here
10         Fruit apple = new Apple();
11         apple.show_name(2);
12     }
13 }

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

 1 package tttttest;
 2
 3 public class Apple extends Fruit{
 4
 5     @Override
 6     public void show_name(int num) {
 7         // TODO Auto-generated method stub
 8         System.out.println("Apple: " + num);
 9     }
10
11 }

输出结果就是Apple: 2

关于@Override标签

@Override是伪代码,表示重写

一来可以当作注释来看

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

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

怎么让IDE自动加@Override标签

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

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

参考资料

java多态之Override

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

时间: 2024-07-30 14:34:17

JAVA重写以及@Override标签的相关文章

Java重写(Override)与重载(Overload)

重写(Override) 重写是子类对父类的允许访问的方法的实现过程进行重新编写,,返回值和形参都不能改变.即外壳不变,核心重写! 重写的好处在于子类可以根据需要,定义特定于自己的行为.也就是说子类能够根据需要实现父类的方法. 重写方法不能抛出新的检查异常或者比被重写方法申明更加宽泛的异常.例如:父类的一个方法申明了一个检查异常IOException,但是在重写这个方法的时候不能抛出Exception异常,因为Exception是IOException的父类,只能抛出IOException的子类

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

转载:http://www.cnblogs.com/octobershiner/archive/2012/03/09/2388370.html 一般用途                                                                                                                                                       帮助自己检查是否正确的复写了父类中已有的方法

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

难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第四十八章:重写方法Override 下一章 "全栈2019"Java第四十九章:重载与重写对比详解 学习小组 加入同步学习小组,共同交流与进步. 方式一:关注头条号Gorhaf,私信"Java学习小组". 方式二:关注公众号Gorhaf,回复"Java学习小组

JAVA重写不需要@override

一,如下代码, package com.boot.enable.bootenable; import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Component; import java.util.concurrent.TimeUnit; @Component("RunnableDemo") public class RunnableDemo imple

Java方法的重写(override)

子类通过继承了父类以后就拥有了父类一切的属性和方法,然而有些父类中的方法对于子类可能并不适用,这时子类可以通过重写父类的方法,用自身的行为替代父类的行为,方法的重写是实现多态的必要条件. 下面一个demo,演示了方法的重写: package cn.ftf.o1; /** * 重写方法(override) * @author 房廷飞 * */ public class Override { public static void main(String[] args) { Horse h = new

java重写和重载

Java 重写(Override)与重载(Overload) 重写(Override) 重写是子类对父类的允许访问的方法的实现过程进行重新编写, 返回值和形参都不能改变.即外壳不变,核心重写! 重写的好处在于子类可以根据需要,定义特定于自己的行为. 也就是说子类能够根据需要实现父类的方法. 重写方法不能抛出新的检查异常或者比被重写方法申明更加宽泛的异常.例如: 父类的一个方法申明了一个检查异常 IOException,但是在重写这个方法的时候不能抛出 Exception 异常,因为 Except

java重写

最近重新温习Java基础知识,查漏补缺:Java重写:Java重写只是存在在父子类之间的概念,子类只能重写父类的 非private和非final方法:对于不想让子类重写的发放可以将方法用private或者final来修饰:如果父类想让子类重写的方法可以用 protected方法来修饰: 1.发生方法重写的两个方法返回值.方法名.参数列表必须完全一致(子类重写父类的方法) 2.子类抛出的异常下不能超过父类相应方法抛出的异常(子类异常不能大于父类异常) 3.子类方法的访问级别不能低于父类相应方法的访

转:C++的重载(overload)与重写(override)

C++ override overload 的区别 override是指在不同作用域中,多个函数原型完全一样,而实现却不同的函数.在C++中,经常发生在类的继承中.当基类中的某个方法是virtual或pure virtual函数时(当然访问权限必须是public或protected,因为从C++设计思想上来讲private的函数不会是virtual的,呵呵),其子类中对该方法的重新实现就属于override.使用时,可以通过基类的指针或者引用所指向的具体对象来确定调用的是哪个方法,从而实现函数的

重写(override)与重载(overload)的区别

一.重写(override) override是重写(覆盖)了一个方法,以实现不同的功能.一般是用于子类在继承父类时,重写(重新实现)父类中的方法. 重写(覆盖)的规则: 1.重写方法的参数列表必须完全与被重写的方法的相同,否则不能称其为重写而是重载. 2.重写方法的访问修饰符一定要大于被重写方法的访问修饰符(public>protected>default>private). 3.重写的方法的返回值必须和被重写的方法的返回一致: 4.重写的方法所抛出的异常必须和被重写方法的所抛出的异常