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

之前的文章我们介绍了一下 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; } 编译错误,引用类型时必须小于或等于父类
25 }·

方法重写(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)方法重载是一个类的多态性表现,而方法重写是子类与父类的一种多态性表现。

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

原文地址:https://www.cnblogs.com/weijiutao/p/11125113.html

时间: 2024-10-08 05:54:07

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

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

之前的文章我们介绍了 Java 中的变量和基本数据类型,本章我们来看一下 Java 的运算符和表达式. 计算机的最基本用途之一就是执行数学运算,作为一门计算机语言,Java也提供了一套丰富的运算符来操纵变量.我们可以把运算符分成以下几组: 算术运算符 关系运算符 位运算符 逻辑运算符 赋值运算符 其他运算符 算术运算符 算术运算符用在数学表达式中,它们的作用和在数学中的作用一样.下表列出了所有的算术运算符. 表格中的实例假设整数变量A的值为10,变量B的值为20: 操作符 描述 例子 + 加法

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

之前的文章我们介绍了 Java 的运算符和表达式,本章我们来看一下 Java 的循环结构. 循环是程序设计语言中反复执行某些代码的一种计算机处理过程,是一组相同或相似语句被有规律的重复性进行. 循环的要素: - 循环变量的初始化 - 循环条件(以循环变量为基础) - 循环变量的改变(向着循环的结束进行改变) Java中有三种主要的循环结构: while 循环 do…while 循环 for 循环 while 循环 while是最基本的循环,它的结构为: while(布尔表达式){ //循环内容

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

在之前的文章我们介绍了一下 Java 中的重载,接下来我们看一下 Java 中的构造方法. 我们之前说过,我们在定义一个变量的时候,java 会为我们提供一个默认的值,字符串为 null,数字为 0.如下: 1 public class HelloWorld { 2 public static void main(String[] args) { 3 User e = new User(); // 创建一个 User 对象 4 e.print(); // 姓名:null 年龄:0 性别:null

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

在之前的文章我们介绍了一下 Java 中的抽象类和抽象方法,本章我们来看一下 Java 中的接口. 在日常生活中,我们会接触到很多类似接口的问题,比如 USB 接口,我们在电脑上插鼠标,键盘,U盘的时候不用去考虑它到底能不能插进去,只要型号对了就肯定能插进去,接口就相当于一个标准,你要想把鼠标插到我的电脑上,在出厂时就必须遵守该电脑定义的接口标准. 在 Java 中同样有接口的概念,当然也会有接口的定义标准. 1.有 interface 定义: 2.只能包含常量和抽象方法: 3.接口不能被实例化

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

在之前的文章我们介绍了一下 Java 中的接口,本章我们来看一下 Java 中类的多态. 在日常生活中,很多意思并不是我们想要的意思,如下: 1.领导:“你这是什么意思?” 小明:“没什么意思,意思意思.” 领导:“你这就不够意思了.” 小明:“小意思,小意思.” 领导:“你这人真有意思.” 小明:“其实也没有别的意思.” 领导:“那我就不好意思了.” 小明:“是我不好意思.” 2.电视剧<快把我哥带走> 妹:“你根本就不懂我.” 哥:“你不说我怎么懂你啊,” 妹:“真的懂不需要说出来,” 哥

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

在之前的文章我们介绍了一下 Java 中的正则表达式,本章我们来看一下 Java 中的 Object. 在日常生活中,任何事物我们都可以看做是一个对象,在编程中是同样的道理,在 Java 编程中其实更突出,因为 Java 就是一门面向对象的编程语言. 我们先来看下面的代码: 1 public class Main { 2 public static void main(String[] args) { 3 Person person = new Person(); 4 // person.age

Java 从入门到进阶之路(十九)

在之前的文章我们介绍了一下 Java 中的Object,本章我们来看一下 Java 中的包装类. 在 Java 中有八个基本类型:byte,short,int,long,float,double,char,boolean,是以值的形式存在的,所以他们并没有面向对象的特征,自然也不继承自 Object,所以不能使用多台,用 Object 的角度去接受基本类型. 假设现在我们有一个计算 1+1 的值,代码如下: 1 public class Main { 2 public static void m

Python 爬虫从入门到进阶之路(十一)

之前的文章我们介绍了一下 Xpath 模块,接下来我们就利用 Xpath 模块爬取<糗事百科>的糗事. 之前我们已经利用 re 模块爬取过一次糗百,我们只需要在其基础上做一些修改就可以了,为了保证项目的完整性,我们重新再来一遍. 我们要爬取的网站链接是 https://www.qiushibaike.com/text/page/1/ . 我们通过 Xpath Helper 的谷歌插件经过分析获取到我们想要的内容为: //div[@class="content"]/span[

成为java高手一条进阶之路

本文将告诉你学习Java需要达到的25个目标,希望能够对你的学习及找工作有所帮助.对比一下自己,你已经掌握了这25条中的多少 条了呢? 1.你需要精通面向对象分析与设计(OOA/OOD).涉及模式(GOF,J2EEDP)以及综合模式.你应该了解UML,尤其是 class,object,interaction以及statediagrams. 2.你需要学习Java语言的基础知识以及它的核心类库 (collections,serialization,streams,networking,?multi