之前的文章我们介绍了一下 Java 中的继承,接下来我们继续看一下 Java 中的继承。

在有些时候,我们通过类继承的方式可以获取父类的方法,但是有些时候父类为我们提供的方法并不完全符合我们的需求,这时候我们就要对类方法进行重写,如下:

  1. public class HelloWorld {
  2. public static void main(String[] args) {
  3. Student student = new Student();
  4. student.name = "张三";
  5. student.age = 18;
  6. student.city = "北京";
  7. student.userInfo(); // 我叫张三,今年18岁
  8.  
  9. Teacher teacher = new Teacher();
  10. teacher.name = "李四";
  11. teacher.age = 28;
  12. teacher.city = "上海";
  13. teacher.userInfo(); // 我叫李四,今年28岁,来自上海
  14. }
  15. }
  16.  
  17. class Person {
  18. String name;
  19. int age;
  20.  
  21. void userInfo() {
  22. System.out.println("我叫" + name + ",今年" + age + "岁");
  23. }
  24. }
  25.  
  26. class Student extends Person {
  27. String city;
  28. }
  29.  
  30. class Teacher extends Person {
  31. String city;
  32.  
  33. void userInfo() {
  34. System.out.println("我叫" + name + ",今年" + age + "岁," + "来自" + city);
  35. }
  36. }

在上面的代码中,我们分别定义了 Student 和 Teacher 两个列,且都继承了 Person 类,不同的是我们在 Teacher 类中定义了一个和父类 Person 类相同的 userInfo() 方法,方法中发发明和参数相同,方法体不同,这其实就是类方法的重写。

重写需要遵循“两同两小一大”原则(一般都是相同):

1、两同

  1)、方法名称相同

    1>、void 和 基本类型时子类和父类必须相同

    2>、引用类型时子类必须小于或等于父类

  2)、参数列表相同

2、两小:

  1)、子类方法的返回值类型小于或等于父类

  2)、子类方法所抛出的异常小于或等于父类

3、一大

  1)、子类的访问权限大于或等于父类

上面的例子我们其实已经说了“两同”了,下面我们看一下“两小”中的 子类方法的返回值类型小于或等于父类

  1. class Person {
  2. String name;
  3. int age;
  4.  
  5. void userInfo() {
  6. System.out.println("我叫" + name + ",今年" + age + "岁");
  7. }
  8.  
  9. double num(){ return 1.23; }
  10.  
  11. Person person(){ return null; }
  12.  
  13. Student student(){ return null; }
  14. }
  15.  
  16. class Student extends Person {
  17.  
  18. double num(){ return 4.56; }
  19.  
  20. // int num(){ return 8; } 编译错误,基本类型必须相同
  21.  
  22. Student person(){ return null; }
  23.  
  24. // Person student(){ return null; } 编译错误,引用类型时必须小于或等于父类

方法重写(Override)很容易让我们想起来之前说过的方法重载(Overload),我们再来看一下之前说过的重载。

  1. public class HelloWorld {
  2. public static void main(String[] args) {
  3. Aoo aoo = new Aoo(); // 创建一个 Aoo 对象
  4. aoo.foo(); // foo 无参
  5. aoo.foo(123); // foo 整型参数123
  6. aoo.foo("abc"); // foo 字符串参数zhangsan
  7. aoo.foo("abc",123); // foo 字符串+整型参数abc123
  8. aoo.foo(123,"abc"); // foo foo 整型+字符串参数123abc
  9. }
  10. }
  11.  
  12. class Aoo {
  13. void foo() {
  14. System.out.println("foo 无参");
  15. }
  16.  
  17. void foo(int num) {
  18. System.out.println("foo 整型参数" + num);
  19. }
  20.  
  21. void foo(String str) {
  22. System.out.println("foo 字符串参数" + str);
  23. }
  24.  
  25. void foo(String str, int num) {
  26. System.out.println("foo 字符串+整型参数" + str + num);
  27. }
  28.  
  29. void foo(int num, String str) {
  30. System.out.println("foo 整型+字符串参数" + num + str);
  31. }
  32. }

重载规则:

  • 被重载的方法必须改变参数列表(参数个数或类型不一样);
  • 被重载的方法可以改变返回类型;
  • 被重载的方法可以改变访问修饰符;
  • 被重载的方法可以声明新的或更广的检查异常;
  • 方法能够在同一个类中或者在一个子类中被重载。
  • 无法以返回值类型作为重载函数的区分标准。

重写与重载之间的区别

区别点 重载方法 重写方法
参数列表 必须修改 一定不能修改
返回类型 可以修改 一定不能修改
异常 可以修改 可以减少或删除,一定不能抛出新的或者更广的异常
访问 可以修改 一定不能做更严格的限制(可以降低限制)

方法的重写(Overriding)和重载(Overloading)是java多态性的不同表现,重写是父类与子类之间多态性的一种表现,重载可以理解成多态的具体表现形式。

  • (1)方法重载是一个类中定义了多个方法名相同,而他们的参数的数量不同或数量相同而类型和次序不同,则称为方法的重载(Overloading)。
  • (2)方法重写是在子类存在方法与父类的方法的名字相同,而且参数的个数与类型一样,返回值也一样的方法,就称为重写(Overriding)。
  • (3)方法重载是一个类的多态性表现,而方法重写是子类与父类的一种多态性表现。

重载和重写可以用下面这张图来形象的表示。重载我们可以认为是多种表现形式,每种表现形式都能实现自己的功能。重写是在原有基础上加强自己的功能。

Java 从入门到进阶之路(十一)的更多相关文章

  1. Java 从入门到进阶之路(二十一)

    在之前的文章我们介绍了一下 Java 中的日期操作,本章我们来看一下 Java 集合框架中的Collection. 早在 Java 2 中之前,Java 就提供了特设类.比如:Dictionary, ...

  2. Java 从入门到进阶之路(一)

    写在前面:从本片文章开始,将记录自己学习 Java 的点滴路程,目标定的并不是让自己成为一个 Java 高手,而是让自己多掌握一门语言,使自己的知识面更广一些,在学习 Java 的过程中如有不对的地方 ...

  3. Java 从入门到进阶之路(二)

    之前的文章我们介绍了一下用 IDEA 编辑器创建一个 Java 项目并输出 HelloWorld,本章我们来看一下 Java 中的变量和基本数据类型. 在这之前我们先来看一下 Java 中的关键字,这 ...

  4. Java 从入门到进阶之路(三)

    之前的文章我们介绍了 Java 中的变量和基本数据类型,本章我们来看一下 Java 的运算符和表达式. 计算机的最基本用途之一就是执行数学运算,作为一门计算机语言,Java也提供了一套丰富的运算符来操 ...

  5. Java 从入门到进阶之路(四)

    之前的文章我们介绍了 Java 的运算符和表达式,本章我们来看一下 Java 的循环结构. 循环是程序设计语言中反复执行某些代码的一种计算机处理过程,是一组相同或相似语句被有规律的重复性进行. 循环的 ...

  6. Java 从入门到进阶之路(五)

    之前的文章我们介绍了 Java 的循环结构,本章我们来看一下 Java 的数组 数组对于每一门编程语言来说都是重要的数据结构之一,当然不同语言对数组的实现及处理也不尽相同. 数组 - 相同数据类型的元 ...

  7. Java 从入门到进阶之路(六)

    之前的文章我们介绍了 Java 的数组,本章我们来看一下 Java 的对象和类. Java 是一种面向对象语言,那什么是对象呢,对象在编程语言中属于一个很宽泛的概念,我们可以认为万事万物都是对象,每个 ...

  8. Java 从入门到进阶之路(七)

    在之前的文章中我们介绍了一下 java 中的对象和类,接下来我们来看一下 Java 中的方法重载. 在显示生活中,我们肯定会遇到这样一个问题,那就是我们再商场买东西的时候在付账时的选择.如下 A:在收 ...

  9. Java 从入门到进阶之路(八)

    在之前的文章我们介绍了一下 Java 中的重载,接下来我们看一下 Java 中的构造方法. 我们之前说过,我们在定义一个变量的时候,java 会为我们提供一个默认的值,字符串为 null,数字为 0. ...

随机推荐

  1. CSPS模拟 88

    今天我还是个弟弟. 果然唯有AK不可超越.. T1 决策单调性,暴力上整体二分. 极限数据跑的挺快,可是被n<k的脑残测试点qj了.. T2 又是大模拟! T3 想到剩余同种数量的彩球完全等效 ...

  2. F#周报2019年第45期

    新闻 邀请博客主们:2019年的F# Advent日历 宣告ML.NET 1.4 .NET Core与Jupyter笔记本 在Jupyter笔记本中使用ML.NET 用于Windows桌面的.NET ...

  3. nmap学习笔记-扫描格式

    习惯性的前言: 之前曾经零零星星的学习过一段时间的nmap,但是因为用的少,后续有慢慢的放下了,这次正好借着工作上的机会重新学习一下nmap,并记录在此. nmap端口状态: open:应用程序在该端 ...

  4. IntelliJ IDEA 中设置左菜单字体, 编辑器字体和控制台的字体

    IntelliJ IDEA 中设置左菜单字体大小 File-Settings,然后选择appearance,下图右侧红色边框中的内容即设置菜单的字体和大小 ​ IntelliJ IDEA 中设置当前编 ...

  5. JavaScript入门经典(第7版)读书笔记

    断断续续看了十来天,终于看完了,还是学到些东西,这本书还是不错的,各方面都有涉及. 补充了下之前不完善的JS 知识 笔记一般只记必要的东西.‎ Table of Contents 1. JavaScr ...

  6. 易初大数据 2019年10月20日 linux死亡导图 王庆超

  7. linux搭建简易网站

    1.检查环境 getenforce #查看seLinux运行状态 Enforcing #强行执行 setenforce #临时关闭selinux vim /etc/selinux/config #编辑 ...

  8. 《计算机网络 自顶向下方法》 第8章 计算机网络中的安全 Part2

    SSL(使 TCP 连接安全) SSL(Secure Socket Layer),即安全套接字层,是对 TCP 的强化 HTTPS 使用 SSL,而 HTTP 不使用 SSL 通过采用机密性.数据完整 ...

  9. Ios第三方FMDB使用说明

    SQLite (http://www.sqlite.org/docs.html) 是一个轻量级的关系数据库.iOS SDK很早就支持了SQLite,在使用时,只需要加入 libsqlite3.dyli ...

  10. PHP读取Excel内的图片

    今天接到了一个从Excel内读取图片的需求,在网上查找了一些资料,基本实现了自己的需求,不过由于查到的一些代码比较久远,不能直接移植到自己的项目里,需要稍加改动一下. 这里介绍一下分别使用phpspr ...