Java继承方法重写实现原理及解析

这篇文章主要介绍了Java继承方法重写实现原理及解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

在Java继承中,子类可以获得父类所有的结构,也可以增加与父类不同的属性和方法。但是,有一种情况,一个相同的方法,子类的行为并不像父类那样,这时,就需要重写父类的方法,下面是重写的代码实现:

代码体现

package com.my.pac12;

/**
 * @author Summerday
 * @date 2019/12/11 21:26
 */

public class Person {
  public void say(){
    System.out.println("say something..");
  }
  public static void see(){
    System.out.println("see something..");
  }
  public int returnNumber(int number){
    return number;
  }
  private void run(){
    System.out.println("running ..");
  }
  public Person returnPerson(){
    return this;
  }
}
class student extends Person{
  //方法名相同,形参列表相同
  public void say(){
    System.out.println("student say something..");
  }
  //返回类型为父类或父类的子类
  public Person returnPerson(){
    System.out.println("子类返回类型可以是父类返回类型或者是其子类类型");
    return this;
  }
  //并不是重写,只是重新定义了新方法
  public void run(){
    System.out.println("student is running..");
  }
  //不是重写,而是发生在父类与子类之间的重载
  public int returnNuber(int number,int otherNumber){
    return number+otherNumber;
  }
  public static void main(String[] args) {
    student s = new student();
    s.say();
    student.see();
    s.see();
    s.run();
    //涉及向上转型
    Person sn = s.returnPerson();
    //调用的是父类的方法
    System.out.println(s.returnNumber(5));
    //调用子类重载父类的方法
    System.out.println(s.returnNuber(5,5));

  }
}

概念

子类包含与父类同名,同参数列表的现象就是方法重写(Override),也叫方法覆盖。

注意事项

"两同两小一大"

方法名相同,形参列表相同。

子类方法返回值类型小于等于父类方法返回值类型。

//父类
public int returnNumber(int number){
  return number;
}
/*基本类型:子类返回值类型小于等于父类返回值类型,下面的语句不允许*/
//子类
public long returnNumber(int number)
//父类
public void say(){
  System.out.println("say something..");
}
/*void类型只能由同样void类型的方法重写*/
//子类
public void say(){
  System.out.println("student say something..");
}
//父类
public Person returnPerson(){
  return this;
}
/*引用类型:子类返回值类型需要与父类相同或者是父类的子类*/
//子类
public Person returnPerson(){
  System.out.println("子类返回类型可以是父类返回类型或者是其子类类型");
  return this;
}

子类方法声明抛出的异常类小于等于父类抛出的异常类。(这个部分之后再进行补充)

子类方法的访问权限大于等于父类方法的访问权限。

//父类
public void say(){
  System.out.println("say something..");
}
/*子类方法的访问权限大于等于父类方法的访问权限,下面的语句不允许*/
//子类
private(protected or 缺省) void say()

其他注意点

两者必须同为类方法或者同为实例方法。(实际上类方法无法被重写,只是单纯被隐藏起来,关于static关键字之后再总结)

//父类
public static void see(){
  System.out.println("see something..");
}
/*两者必须同为类方法(static修饰)或者同为实例方法,下面的语句不允许*/
//子类
public void see()

父类被private修饰,子类无法重写父类。

//父类
private void run(){
  System.out.println("running ..");
}
/*子类无法重写方法,下面的语句是假象,其实是重新定义了一个新方法*/
//子类
public void run(){
  System.out.println("student is running..");
}

重写与重载

重载主要(对!是主要)发生在同一个类的多个同名方法之间,且参数列表不同。
为什么说是主要呢,因为重载有可能在子类与父类之间发生,如下:

//父类
public int returnNumber(int number){
  return number;
}
/*发生在父类与子类之间的重载*/
//子类
public int returnNuber(int number,int otherNumber){
  return number+otherNumber;
}

重写是发生在父类与子类同名方法之间,且参数列表相同。

@Override注解

@Override注解对方法重写起到辅助作用,并不会对代码本身产生影响。

标注该注解,向人表明下面的方法将要重写父类的某些方法。

标注该注解,向机器表明下面部分将要重写,让机器帮忙检查错误。如果不是重写,那么就会产生让人不舒服的提示,如图所示。

上图也验证了三种不是方法重写的例子:

  • static修饰的父类方法。
  • private修饰的父类方法。
  • 子类重载而非重写父类方法。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • 详解 Java继承关系下的构造方法调用

    详解 Java继承关系下的构造方法调用 在Java中创建一个类的对象时,如果该类存在父类,则先调用父类的构造方法,然后再调用子类的构造方法.如果父类没有定义构造方法,则调用编译器自动创建的不带参数的默认构造方法.如果父类定义了public的无参的构造方法,则在调用子类的构造方法前会自动先调用该无参的构造方法.如果父类只有有参的构造方法,没有无参的构造方法,则子类必须在构造方法中必须显式调用super(参数列表)来指定某个有参的构造方法.如果父类定义有无参的构造方法,但无参的构造方法声明为priv

  • 详解Java继承中属性、方法和对象的关系

    大家都知道子类继承父类是类型的继承,包括属性和方法!如果子类和父类中的方法签名相同就叫覆盖!如果子类和父类的属性相同,父类就会隐藏自己的属性! 但是如果我用父类和子类所创建的引用指向子类所创建的对象,父类引用所调用子类对象中的属性值或方法的结果是什么呢? 看代码: public class FieldDemo { public static void main(String[] args){ Student t = new Student("Jack"); Person p = t;/

  • java的继承原理与实现方法详解

    本文实例讲述了java的继承原理与实现方法.分享给大家供大家参考,具体如下: 继承 1.java中是单继承的.每个子类只有一个父类. 语法:子类 extends 父类 2.在java中,即使没有声明父类,也有一个隐含的父类,就是Object类 3.在子类中可以使用super来调用父类的方法 4.继承中的构造方法问题 在new一个子类实例的过程中,会优先自动调用父类默认的无参数构造方法,然后再调用子类的构造方法.如果父类没有默认的构造方法,只有带参数的构造方法,此时就会出错. 除了由jvm自动调用

  • 浅谈Java之终止继承:Final类和Fianl方法

    前言 关键字Final不仅可以用来修饰变量,而且对类及其方法的继承也有很大的影响,本文将从类与方法两个方面介绍final关键字的功能. Final类 当关键字final用来修饰类时,其含义是该类不能再派生子类,换句话说,任何其他类都不能继承用final修饰的类,即使该类的访问权限为pubilc类型,也不能被继承:否则,将编译报错. 只有当需要确保类中的方法都不被重写时才应该建立最终(final)类,final关键字将会为这些方法提供安全,没有任何人能够重写final类中的方法,因为不能继承. 例

  • java实现多线程的两种方式继承Thread类和实现Runnable接口的方法

    实现方式和继承方式有什么区别呢? *区别: *继承Thread:线程代码存放在Thread子类run方法中 *实现Runnable:线程代码存放在接口的子类的run方法中 *实现方式的好处:避免了单继承的局限性 *在定义线程时,建议使用实现方式,当然如果一个类没有继承父类,那么也可以通过继承Thread类来实现多线程 *注意:Runnable接口没有抛出异常,那么实现它的类只能是try-catch不能throws *Java对多线程的安全问题提供了专业的解决方式就是同步代码块synchroniz

  • java继承中的构造方法实例解析

    本文实例讲述了java继承中的构造方法.分享给大家供大家参考.具体如下: 继承中的构造方法: 1.子类的构造过程中必须调用其基类的构造方法. 2.子类可以在自己的构造方法中使用super(argument_list)调用基类的构造方法. 2.1.使用this(argument_list)调用本类的另外构造方法.   2.2.如果调用super,必须写在子类构造方法的第一行. 3.如果子类的构造方法中没有显示的调用基类的构造方法,则系统默认调用基类的无参数构造方法. 4.如果子类构造方法中既没有显

  • java用接口、多态、继承、类计算三角形和矩形周长及面积的方法

    本文实例讲述了java用接口.多态.继承.类计算三角形和矩形周长及面积的方法.分享给大家供大家参考.具体如下: 定义接口规范: /** * @author vvv * @date 2013-8-10 上午08:56:48 */ package com.duotai; /** * * */ public interface Shape { public double area(); public double longer(); } /** * @author vvv * @date 2013-8

  • Java 继承方法实例详解

    继承是java面向对象编程技术的一块基石,因为它允许创建分等级层次的类.继承可以理解为一个对象从另一个对象获取属性的过程. 如果类A是类B的父类,而类B是类C的父类,我们也称C是A的子类,类C是从类A继承而来的.在Java中,类的继承是单一继承,也就是说,一个子类只能拥有一个父类 继承中最常使用的两个关键字是extends和implements. 这两个关键字的使用决定了一个对象和另一个对象是否是IS-A(是一个)关系. 通过使用这两个关键字,我们能实现一个对象获取另一个对象的属性. 所有Jav

  • 解析Java继承中方法的覆盖和重载

    方法的覆盖 在类继承中,子类可以修改从父类继承来的方法,也就是说子类能创建一个与父类方法有不同功能的方法,但具有相同的名称.返回值类型.参数列表. 如果在新类中定义一个方法,其名称.返回值类型和参数列表正好与父类中的相同,那么,新方法被称做覆盖旧方法. 参数列表又叫参数签名,包括参数的类型.参数的个数和参数的顺序,只要有一个不同就叫做参数列表不同. 被覆盖的方法在子类中只能通过super调用. 注意:覆盖不会删除父类中的方法,而是对子类的实例隐藏,暂时不使用. 请看下面的例子: public c

  • Java继承方法重写实现原理及解析

    这篇文章主要介绍了Java继承方法重写实现原理及解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 在Java继承中,子类可以获得父类所有的结构,也可以增加与父类不同的属性和方法.但是,有一种情况,一个相同的方法,子类的行为并不像父类那样,这时,就需要重写父类的方法,下面是重写的代码实现: 代码体现 package com.my.pac12; /** * @author Summerday * @date 2019/12/11 21:26 */

  • Java main方法String[]args原理实例解析

    一个程序中必定会有一个入口,java中main方法就是一个项目的的入口, public static void main(String[] args) {} eclipse的生成快捷键main+回车 ,idea的生成快捷键:psvm+回车 args数组是main方法自带的,我也不知道干什么的最近刷题遇到了三个有关的这个的题目看着我迷迷糊糊的记录一下 第一题: 第二题: 第三题 三个题都涉及了这个String[]args数组 下面以第二题为例简单说: 下面有一段代码,简单看看跟题目一样: publ

  • 详解Java中方法重写与重载的区别(面试高频问点)

    Java中方法重写与重载的区别 重 写 重 载 子类方法对父类方法的覆盖 同一个类中同名方法的重载(同一类包括从父类继承的方法) 方法名相同且参数个数类型顺序相同 参数个数或类型顺序至少满足一点不同 只允许访问权限更宽松 访问权限任意 返回值类型若是基本类型则不允许不同:若是复合类型则在子类与父类间必须至少存在继承关系 返回值类型任意 final修饰的父类,子类不能重写,反之可以 final任意 静态方法与实例方法不能互相重写 任意 构造方法不能被重写 构造方法可以重载,任意 一句话描述清楚:

  • Java toString方法重写工具之ToStringBuilder案例详解

    apache的commons-lang3的工具包里有一个ToStringBuilder类,这样在打日志的时候可以方便的打印出类实例中的各属性的值. 具体用法如下: import org.apache.commons.lang3.builder.ToStringBuilder; import org.apache.commons.lang3.builder.ToStringStyle; public class Message { private String from; private Stri

  • Java中方法重写与重载的区别

    目录 一.重写(Override) 二.重载(Overload) 三.总结 Java方法重写(Override)与重载(Overload)的区别(超详细) 首页在我们要学习这个知识点之前,应该要先了解什么是多态? 在最初学习java的时候,人们都知道,java这种面向对象的语言,一共有三大特征,分别是:封装.继承.多态. 多态是同一个行为具有多个不同表现形式或形态的能力. 举个例子,比如大多数动物(抽象类)会叫,但是狗(实现类)就是汪汪汪,猫(实现类)就是喵喵喵. 多态实现的必要条件 子类必须继

  • java继承学习之super的用法解析

    继承supersuper关键字的用法和this关键字的用法相似this:代表本类对象的引用super:代表父类存储空间的标识(可以理解为父类对象引用) package com.ithema_20; /*   测试类   继承   super   super关键字的用法和this关键字的用法相似   this:代表本类对象的引用   super:代表父类存储空间的标识(可以理解为父类对象引用)  */ public class Demo {     public static void main(

  • 详解Java中方法重写和方法重载的6个区别

    目录 1.方法重写 1.1 基本用法 1.2 使用场景 1.3 注意事项 2.方法重载 2.1 基本使用 2.2 使用场景 2.3 注意事项 3.方法重写 VS 方法重载 总结 方法重写(Override)和方法重载(Overload)都是面向对象编程中,多态特性的不同体现,但二者本身并无关联,它们的区别犹如马德华之于刘德华的区别,除了名字长得像之外,其他的都不像. 接下来咱们就来扒一下二者的具体区别. 1.方法重写 方法重写(Override)是一种语言特性,它是多态的具体表现,它允许子类重新

  • java tostring方法重写代码示例

    当需要将一个对象输出到显示器时,通常要调用他的toString()方法,将对象的内容转换为字符串.java中的所有类默认都有一个toString()方法 默认情况下 System.out.println(对象名)或者System.out.println(对象名.toString())输出的是此对象的类名和此对象对应内存的首地址 如果想自定义输出信息必须重写toString()方法 注意事项 1.必须被声明为public 2.返回类型为String 3.方法的名称必须为toString,且无参数

  • Java并发工具类LongAdder原理实例解析

    LongAdder实现原理图 高并发下N多线程同时去操作一个变量会造成大量线程CAS失败,然后处于自旋状态,导致严重浪费CPU资源,降低了并发性.既然AtomicLong性能问题是由于过多线程同时去竞争同一个变量的更新而降低的,那么如果把一个变量分解为多个变量,让同样多的线程去竞争多个资源. LongAdder则是内部维护一个Cells数组,每个Cell里面有一个初始值为0的long型变量,在同等并发量的情况下,争夺单个变量的线程会减少,这是变相的减少了争夺共享资源的并发量,另外多个线程在争夺同

随机推荐