Java 从入门到进阶之路(十一)
之前的文章我们介绍了一下 Java 中的继承,接下来我们继续看一下 Java 中的继承。
在有些时候,我们通过类继承的方式可以获取父类的方法,但是有些时候父类为我们提供的方法并不完全符合我们的需求,这时候我们就要对类方法进行重写,如下:
public class HelloWorld {
public static void main(String[] args) {
Student student = new Student();
student.name = "张三";
student.age = 18;
student.city = "北京";
student.userInfo(); // 我叫张三,今年18岁
Teacher teacher = new Teacher();
teacher.name = "李四";
teacher.age = 28;
teacher.city = "上海";
teacher.userInfo(); // 我叫李四,今年28岁,来自上海
}
}
class Person {
String name;
int age;
void userInfo() {
System.out.println("我叫" + name + ",今年" + age + "岁");
}
}
class Student extends Person {
String city;
}
class Teacher extends Person {
String city;
void userInfo() {
System.out.println("我叫" + name + ",今年" + age + "岁," + "来自" + city);
}
}
在上面的代码中,我们分别定义了 Student 和 Teacher 两个列,且都继承了 Person 类,不同的是我们在 Teacher 类中定义了一个和父类 Person 类相同的 userInfo() 方法,方法中发发明和参数相同,方法体不同,这其实就是类方法的重写。
重写需要遵循“两同两小一大”原则(一般都是相同):
1、两同
1)、方法名称相同
1>、void 和 基本类型时子类和父类必须相同
2>、引用类型时子类必须小于或等于父类
2)、参数列表相同
2、两小:
1)、子类方法的返回值类型小于或等于父类
2)、子类方法所抛出的异常小于或等于父类
3、一大
1)、子类的访问权限大于或等于父类
上面的例子我们其实已经说了“两同”了,下面我们看一下“两小”中的 子类方法的返回值类型小于或等于父类
class Person {
String name;
int age;
void userInfo() {
System.out.println("我叫" + name + ",今年" + age + "岁");
}
double num(){ return 1.23; }
Person person(){ return null; }
Student student(){ return null; }
}
class Student extends Person {
double num(){ return 4.56; }
// int num(){ return 8; } 编译错误,基本类型必须相同
Student person(){ return null; }
// Person student(){ return null; } 编译错误,引用类型时必须小于或等于父类
}·
方法重写(Override)很容易让我们想起来之前说过的方法重载(Overload),我们再来看一下之前说过的重载。
public class HelloWorld {
public static void main(String[] args) {
Aoo aoo = new Aoo(); // 创建一个 Aoo 对象
aoo.foo(); // foo 无参
aoo.foo(123); // foo 整型参数123
aoo.foo("abc"); // foo 字符串参数zhangsan
aoo.foo("abc",123); // foo 字符串+整型参数abc123
aoo.foo(123,"abc"); // foo foo 整型+字符串参数123abc
}
}
class Aoo {
void foo() {
System.out.println("foo 无参");
}
void foo(int num) {
System.out.println("foo 整型参数" + num);
}
void foo(String str) {
System.out.println("foo 字符串参数" + str);
}
void foo(String str, int num) {
System.out.println("foo 字符串+整型参数" + str + num);
}
void foo(int num, String str) {
System.out.println("foo 整型+字符串参数" + num + str);
}
}
重载规则:
- 被重载的方法必须改变参数列表(参数个数或类型不一样);
- 被重载的方法可以改变返回类型;
- 被重载的方法可以改变访问修饰符;
- 被重载的方法可以声明新的或更广的检查异常;
- 方法能够在同一个类中或者在一个子类中被重载。
- 无法以返回值类型作为重载函数的区分标准。
重写与重载之间的区别
| 区别点 | 重载方法 | 重写方法 |
|---|---|---|
| 参数列表 | 必须修改 | 一定不能修改 |
| 返回类型 | 可以修改 | 一定不能修改 |
| 异常 | 可以修改 | 可以减少或删除,一定不能抛出新的或者更广的异常 |
| 访问 | 可以修改 | 一定不能做更严格的限制(可以降低限制) |
方法的重写(Overriding)和重载(Overloading)是java多态性的不同表现,重写是父类与子类之间多态性的一种表现,重载可以理解成多态的具体表现形式。
- (1)方法重载是一个类中定义了多个方法名相同,而他们的参数的数量不同或数量相同而类型和次序不同,则称为方法的重载(Overloading)。
- (2)方法重写是在子类存在方法与父类的方法的名字相同,而且参数的个数与类型一样,返回值也一样的方法,就称为重写(Overriding)。
- (3)方法重载是一个类的多态性表现,而方法重写是子类与父类的一种多态性表现。
重载和重写可以用下面这张图来形象的表示。重载我们可以认为是多种表现形式,每种表现形式都能实现自己的功能。重写是在原有基础上加强自己的功能。

Java 从入门到进阶之路(十一)的更多相关文章
- Java 从入门到进阶之路(二十一)
在之前的文章我们介绍了一下 Java 中的日期操作,本章我们来看一下 Java 集合框架中的Collection. 早在 Java 2 中之前,Java 就提供了特设类.比如:Dictionary, ...
- Java 从入门到进阶之路(一)
写在前面:从本片文章开始,将记录自己学习 Java 的点滴路程,目标定的并不是让自己成为一个 Java 高手,而是让自己多掌握一门语言,使自己的知识面更广一些,在学习 Java 的过程中如有不对的地方 ...
- Java 从入门到进阶之路(二)
之前的文章我们介绍了一下用 IDEA 编辑器创建一个 Java 项目并输出 HelloWorld,本章我们来看一下 Java 中的变量和基本数据类型. 在这之前我们先来看一下 Java 中的关键字,这 ...
- Java 从入门到进阶之路(三)
之前的文章我们介绍了 Java 中的变量和基本数据类型,本章我们来看一下 Java 的运算符和表达式. 计算机的最基本用途之一就是执行数学运算,作为一门计算机语言,Java也提供了一套丰富的运算符来操 ...
- Java 从入门到进阶之路(四)
之前的文章我们介绍了 Java 的运算符和表达式,本章我们来看一下 Java 的循环结构. 循环是程序设计语言中反复执行某些代码的一种计算机处理过程,是一组相同或相似语句被有规律的重复性进行. 循环的 ...
- Java 从入门到进阶之路(五)
之前的文章我们介绍了 Java 的循环结构,本章我们来看一下 Java 的数组 数组对于每一门编程语言来说都是重要的数据结构之一,当然不同语言对数组的实现及处理也不尽相同. 数组 - 相同数据类型的元 ...
- Java 从入门到进阶之路(六)
之前的文章我们介绍了 Java 的数组,本章我们来看一下 Java 的对象和类. Java 是一种面向对象语言,那什么是对象呢,对象在编程语言中属于一个很宽泛的概念,我们可以认为万事万物都是对象,每个 ...
- Java 从入门到进阶之路(七)
在之前的文章中我们介绍了一下 java 中的对象和类,接下来我们来看一下 Java 中的方法重载. 在显示生活中,我们肯定会遇到这样一个问题,那就是我们再商场买东西的时候在付账时的选择.如下 A:在收 ...
- Java 从入门到进阶之路(八)
在之前的文章我们介绍了一下 Java 中的重载,接下来我们看一下 Java 中的构造方法. 我们之前说过,我们在定义一个变量的时候,java 会为我们提供一个默认的值,字符串为 null,数字为 0. ...
随机推荐
- P3665 [USACO17OPEN]Switch Grass
题目描述 N个点M条边的无向图,每个点有一个初始颜色,每次改变一个点的颜色,求改变后整张图上颜色不同的点之间的距离最小值. 思路 考虑整张图的距离最小值一定是一条边,而不可能是一条路径,那么显然这条边 ...
- centos7 yum 安装 mysql5.7
1.查看系统中是否已安装 MySQL 服务,以下提供两种方式: rpm -qa | grep mysqlyum list installed | grep mysql 2.如果已安装则删除 MySQL ...
- C语言变量名和地址的关系【转载】//基础的东西
原文链接:http://blog.csdn.net/ssff1/archive/2009/12/13/4998787.aspx 变量名不占空间 变量:用来标识(identify)一块内存区域,这块区域 ...
- 易初大数据 2019年11月13日 Linux 王庆超
★安装Red Hat Enterprise Linux7.41 ◆1通过键盘的方向键选择“lnstall Red Hat Enterprise Linux7.4”选项来直接安装Linux 系统. ◆2 ...
- 【实战】如何通过html+css+mysql+php来快速的制作动态网页(以制作一个博客网站为列)
一.开发环境的搭建 (1)apache+php+mysql环境搭建 因为要用apache来做服务器,mysql作为数据库来存储数据,php来写代码以此实现网页与数据库的交互数据,所以需要下载上述软件, ...
- 详解Redis RDB持久化、AOF持久化
1.持久化 1.1 持久化简介 持久化(Persistence),持久化是将程序数据在持久状态和瞬时状态间转换的机制,即把数据(如内存中的对象)保存到可永久保存的存储设备中(如磁盘). 1.2 red ...
- BeautifulSoup随笔
BeautifulSoup是一个类 b = BeautifulSoup(html) b对象有与html结构相关的各种方法和和属性. a = b.findAll('a')获得标签的对象 a对象又有关于属 ...
- A Lot of Games(Trie树 + 博弈)
题目链接:http://codeforces.com/contest/455/problem/B 题意:n, k 分别表示 字符串组数 和 比赛次数. 从一个空单词开始, a,b二人分别轮流往单词后 ...
- 解构ffmpeg(一)
ffmpeg应用程序项目将其核心库libav*的使用或编程抽象成FilterGraph,InputFile,OutputFile,InputStream,OutputStream,InputFilte ...
- Python 操作Gitlab-API 实现批量的合并分支
1.需求:每次大批量上线完成后,都会进行将hotfix合并到Master,合并到test/uat等等重复操作(上线发布后自动合并master已完成). 2.现实:在完成发布后自动合并master后,可 ...