JAVA类与对象(八)-----重写
重写:子类对父类的允许访问的方法的实现过程进行重新编写!返回值和形参都不能改变。即:外壳不变,核心重写!
好处:可以根据子类的需要,定义特定于自己的行为。也就是说子类能够根据需要实现父类的方法。
class Animal{
public void move(){
System.out.println("动物可以移动");
}
}
class Dog extends Animal{
public void move(){
System.out.println("狗可以跑和走");
}
}
public class AnimalThree{
public static void main(String args[]){
Animal a = new Animal(); // Animal 对象
Animal b = new Dog(); // Dog 对象
a.move();// 执行 Animal 类的方法
b.move();//执行 Dog 类的方法
}
}
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAKkAAAA0CAIAAAB+T4/lAAADwUlEQVR4nO2az4oTQRDG+231IAjievPiQQQVPHvyIgiizzC3eFAiyAhZmSXZLEuEQPIIXmQYuqu+/rpnJkn/+Q4yqa6prq5fV88kqzkej4fDYb/f73a77XbbdV3btn/fPTDGNE1jBnI/WhbgrEUAoYAFT41ziEivn9GdF8ex/Id27YJJeLK6aewbR27EkcUdBuHLqvmLntqMzKiWyTABb3GsC2DEcnOYoG6g70eqnwyndfliijv3vLNMegL2/O6Om0XUfLNMG/mck87HvurSVdmXqwj2+Ai6hKejdygoq0RfU/w6I3vtUc08vHmcYpDK3hjIXgMAquyORhfOixxPBLYOWFfQepPXhH2vsfc2MT8L4I2zIj/ymeSgIPYuSNw32r8g5tAuJqB9ZNhbOXih4vUmr9397f3d+u72Zn1z/Wf1u/3188f3b3zfM5X1svdeY6M4hJkFUWR2WJLS2IMtL9YCNNNZ2IfGCV1vDsJ97y0cZmmcPTETe2AHM3qTJ7NKVXOwF5vmjOyHOQDwjLFo9qCtrUIbqcNOyX6429y0ccKapRT2IjBQC6vKeBMMh0gMZEpiPswSQtebvBj2RofnbRQtjnfU28qM0Y3JbFDNQcsqVfHv+SactGvha6exBzDwUYFDRa83YQX1fQT76L5hQMbtRcazdPaWmNKIbthfi+B1JqGK/JhMyPUmLJL9mH7C9jhn4IAfCkH7Lyil9BTxm25VJqrsy1Uo+5MdfdGH8xi3Se5KRiO/3w/V0BLvZSxuEPKtjX/S4xyyEvObblChNXmRg3c0zRlvLLzbonPOR94zX6tmaFmZdgdbQRxlTgtxFi1/cYHj99CFiu97pqxGr+zk7Ml8QmfxRstH5N9ytCow3al5akYQ2dpVokV0Fn1wAt7R5AV+z+99xIJaQ64zuMZGPITjR/e9tle0DZSDmO94Lum52ZN7gmHv0qp9/1/Mu96FsO/p9inx7IOyIkeTV9x3vPOyH1qso1hscW0VQflnqKD/t2MV2sA+A93mGpmKa70uBnRviWOvLScHhb7raReuM7i2jAAYtltpiHGAPSj/DLXZbNbrddd1q9WqbdvlcrlYLLR3PVd8dTT2PJgecH8XuQ/cOKCVC2L/9uuzN1+uXn9++urTk5cfH7/48Oj5+4enZI99hkTxRmGCuB/xkVMue+3sxUPRzpoDvrGRFBRBdBPDavFTFe77STqecZ5qougI+RDlxZz5VXmqsi9XlX25quzLVWVfrir7clXZl6vKvlxV9uWqsi9XlX25quyL1T/oByjznCzHOgAAAABJRU5ErkJggg==" alt="" />
在上面的例子中可以看到,尽管b属于Animal类型,但是它运行的是Dog类的move方法。
这是由于在编译阶段,只是检查参数的引用类型。
然而在运行时,Java虚拟机(JVM)指定对象的类型并且运行该对象的方法。
因此在上面的例子中,之所以能编译成功,是因为Animal类中存在move方法,然而运行时,运行的是特定对象的方法。
下例是错误的:
class Animal{
public void move(){
System.out.println("动物可以移动");
}
}
class Dog extends Animal{
public void move(){
System.out.println("狗可以跑和走");
}
public void bark(){
System.out.println("狗可以吠叫");
}
}
public class AnimalFour{
public static void main(String args[]){
Animal a = new Animal(); // Animal 对象
Animal b = new Dog(); // Dog 对象
a.move();// 执行 Animal 类的方法
b.move();//执行 Dog 类的方法
b.bark();
}
}
这个例子编译无法通过,应该将对象b声明那里改为“Dog b=new Dog();”,得到的正确结果是:
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAARQAAABDCAIAAADS7m3VAAAFW0lEQVR4nO2cS5bbOgxEudtsJ0vSBnrYo17B28Ub5ESWSaBQgKhfXHeQI1MQWKRRouw2035+fr6/v7++vv77/au1tixL29C9NMExTIaJFPRfRThv54tP9ThF4fIXrOSm76NnHl6uzFPmbvIucWyz5qFQhxeQMo83uWCEMg/mPgr/KJF5Eozm8VbSNsk8Y/5tCz4bYpqHzD9e253K6lwsQs3ekHGPjB7MMpgnmxyPtzYDzCmzoxbNzwT2P7bh4HF+pxyD7rx576YbywP9hnnMYzyxYePR8+YpHOvSU+glWWuXuQqLAS9xmdWqOmaKeUA8aE+92aMZUt2BtObLVMV0Z7PmSU3dQfO2RqbcwpsH6znaPO0g8LdtPHwFrNNnDpiPT8nwTuFJJ99poJMpJlLwafN2kHmAntQk4+7Gl5eZJ9VxoTrHUztnYZZ59uThzYNHlCroufNGWp03D9bzEeZZbx4m2epMTSLuGmsoyFt7HPvFebp4YJ5wOF6eE+btOPNk9Rd0em/BfLbmWQa6YPxOMNW5TcLXpRdvRno9Mmc9JVsB4eR0B6ARM2o4Z96WgTGMDMAHTB6gdpwETx7Itotu5dnJKr1reRzjG3N+vw+dug/iIPMcaHfnvjK9r6NHcZ9ORZG55hHig5B5hChCmgc/RdzhE0J4KqVKT00i5mTzeB9XmA8wvB/MJDKPmAz4YehCfPOzDF+vgeCQ0DO4I+A9MK7UeIV4sXPl8cwTLiN8L8AwWBX5klcixBuheUYn4Du39y/IuW03BXgvGfN0GkJX4PEK8aKw8jClGZonPMaN5ilc9CkbMBYVnw7+eY55w/assuUS82TzZMcrxBvjyhNWHjZDG0x1kHlAO+gxFE+qEmKaeczb9oXm2WoAzmEaZR5hw5gHLCxdpTbrHn+mebZ2HWVjwV6LzCNsmG3YoJi6MsUu2p4i65iUZOphhpAdrxAvwGY4r/rDW7WXJzwbLiZM45iTcbgX4KkSIt4Ml7XK2MIXn2ceUM14scKpyuMVojVi5SmYp3znZpxQMzMTKfOIHPiPpExtmWE43ssQBpOuMA3AKCHHK0Rr0Dx77ui4vRYMAvBzXcrAKUnio9FmOCGKyDxCFGHMc9rTS/n5ak/YlKvEJ1L4O8+Whca8lmkZk5Af/flPO1iDEDbez3NSleoRegZ80PeCsTOxXcuahTAwH9u8cszWJbPgAC+ZZ5n1yuzF028OcL8Jxb8PXnmYumx+aU43D6kn20uYTQgD8MNQr4yY9cGL9BpB5s6WZosZbMZgAeFZIV50v21b282K7E6NweAYN+JTOH955fHM5jlQiDe8r6pHqxxtHtJUjHnGctfKI+bjfWFwE/Os9lgl8eZJqSLPCvGC/6r6WvNsW7qnKXOR8UaR0i8EItxJ2lVqg3d6cL8fG5mS9VYbM+F4Sc083nCEeIP5wsA7GIPBcdcIKh63dzLMPKA9pV8IRPiFwQhfXp55+MpeHbJeRRppzAMWE5lHVLjEPDhmawnsNCbJ+BIvejKPYDE/8/CPWx5ksBeAL1wsUhnMMDOtl18I9j89DE8Vgmd1VM4gS4hdaDOcEEVkHiGKPHEnaSpy7rVCvLj5TlLQbyq+1osQiPvvJDXt58kzHRv2IkSFp+wk5c2TihGizlN2kpIGkHnEedx/J+lWDwD0LvOIQ7j5TlKtPOK+3Hwnqcwj7ssjdpKaacPk3rUyj5jDI3aSmmmz5lltI/OIOTxiJ6kZ7CU3BTN9CZHj/jtJgXVJJWZfQuzlETtJzYOUklCVEGnuvJOUSVhwgswj5vCgnaSp4EKnQuR4yk5SnG2uMCEotBlOiBr/A2uFGzarEG0EAAAAAElFTkSuQmCC" alt="" />
方法的重写规则
- 参数列表必须完全与被重写方法的相同;
- 返回类型必须完全与被重写方法的返回类型相同;
- 访问权限不能比父类中被重写的方法的访问权限更低。例如:如果父类的一个方法被声明为public,那么在子类中重写该方法就不能声明为protected。
- 父类的成员方法只能被它的子类重写。
- 声明为final的方法不能被重写。
- 声明为static的方法不能被重写,但是能够被再次声明。
- 子类和父类在同一个包中,那么子类可以重写父类所有方法,除了声明为private和final的方法。
- 子类和父类不在同一个包中,那么子类只能够重写父类的声明为public和protected的非final方法。
- 重写的方法能够抛出任何非强制异常,无论被重写的方法是否抛出异常。但是,重写的方法不能抛出新的强制性异常,或者比被重写方法声明的更广泛的强制性异常,反之则可以。
- 构造方法不能被重写。
- 如果不能继承一个方法,则不能重写这个方法。
JAVA类与对象(八)-----重写的更多相关文章
- Java类和对象初始化
类的生命周期: Java类的初始化: 本阶段负责为类变量赋正确的初始值.(类变量即静态变量) Java编译器把所有的类变量初始化语句和静态初始化器通通收集到<clinit>方法中,该方法只 ...
- java类和对象之间的差
java类和对象之间的差别是一个普遍的问题,刚开始学习java当它来到与类和对象接触.今天就来总结一下它们之间的差异. 先说说class和object差异.事实上,词:object是全部class的父 ...
- 危险代码:如何使用Unsafe操作内存中的Java类和对象
危险代码:如何使用Unsafe操作内存中的Java类和对象—Part1 危险代码:如何使用Unsafe操作内存中的Java类和对象—Part2 危险代码:如何使用Unsafe操作内存中的Java类和对 ...
- [Java初探08]__简单学习Java类和对象
前言 在前面的学习中,我们对面向对象的编程思想有了一个基本的了解,并且简单的了解了类和对象的定义.那么类和对象在Java语言中是如何表现的,这次,就从实际出发,学习一下一下类和对象在Java语言中的使 ...
- java类和对象
类是对象的抽象 对象是类的一个实例类 对象 = new 类();拿对象可以操作这个类里的方法 java类与对象的区别是个老生常谈的问题,刚开始学java的时候就开始接触类和对象,今天来总结一下他们之间 ...
- JAVA类与对象(九)------多态
多态是同一个行为具有多个不同表现形式或形态的能力.多态性是对象多种表现形式的体现. 多态存在的三个必要条件: 继承 重写 父类引用指向子类对象 例:Parent p = new Child(); 当使 ...
- java类与对象的动手动脑和其他小问题
在Java中,我们可以通过组合一私有字段和一对get/set方法来定义一个属性.私有的变量,共有的方法. package sample; /** * 自定义Java类的示例 */ class MyCl ...
- JAVA类和对象创建
面向对象 学习目标: 理解面向对象的编程思想 理解类与对象的关系 如何创建类与对象 方法重载 一:什么是面向对象编程(OOP) 面向对象编程(Object Oriented Programming,O ...
- Java 类和对象3
编写Java应用程序.首先,定义描述学生的类——Student,包括学号(int).姓名(String).年龄(int)等属性:二个方法:Student(int stuNo,String name,i ...
- 解析Java类和对象的初始化过程
类的初始化和对象初始化是 JVM 管理的类型生命周期中非常重要的两个环节,Google 了一遍网络,有关类装载机制的文章倒是不少,然而类初始化和对象初始化的文章并不多,特别是从字节码和 JVM 层次来 ...
随机推荐
- 连接器|网络滤波连接器|电脑连接器|RJ45变压器-华联威电子有限公司
连接器|网络滤波连接器|电脑连接器|RJ45变压器-华联威电子有限公司
- solr5.5教程-tomcat布署
tomcat和solr在各自官网下载,版本如下: tomcat版本:8.0.24 solr版本:5.5.0 1.solr解压后,目录结构如下: 2.tomcat的webapps里新建solr目录, 把 ...
- C# 集合 — Hashtable 线程安全
基础知识重要吗?真的很重要. 就在笔者与同事聊天中突然同事提出一个问题,让笔都有点乱了手脚(有点夸张),题目是这样的: 问:Hashtable 是线程安全的吗? 答:…… (沉默中,Yes Or No ...
- PHP中的Array
PHP中的数组是一个有序映射(1对1的关系 key->value).Array是一个综合体:可表示数组.字典.集合等. key可以是int或string.value可以是任意类型. key如下情 ...
- sqoop简单import使用
一.sqoop作用? sqoop是一个数据交换工具,最常用的两个工具是导入导出. 导入导出的参照物是hadoop,向hadoop导数据就是导入. 二.sqoop的版本? sqoop目前有两个版本,1. ...
- CentOS配置FTP(VSFTPD)
一.vsftp安装篇 # 安装vsftpd yum -y install vsftpd # 启动 service vsftpd start # 开启启动 chkconfig vsftpd on 二.v ...
- mac brew install redis
在mac 下安装redis 执行brew install redis ==> Downloading http://download.redis.io/releases/redis-2.8.19 ...
- Android SDK中国在线更新镜像服务器 解决GOOGLE更新无法下载 更新失败的问题
Android Tools Android SDK在线更新镜像服务器 中国科学院开源协会镜像站地址: IPV4/IPV6: http://mirrors.opencas.cn 端口:80 IPV4/I ...
- STM32F0xx_TIM输出PWM配置详细过程
前言 前面我说过STM32的定时器功能很强大,今天就来总结一下它的另外一个“强大”功能:TIM的比较输出功能,输出可调PWM波形.直接调用函数接口“TIM2_CH1_PWM(uint32_t Freq ...
- 第三章 设计程序架构 之 设计实现Windows Azure 角色生命周期
1. 概述 Windows Azure 是微软的云计算平台.用于 在微软数据中心 通过全局网络 生成.发布和管理应用程序. 本章内容包括 startup tasks 以及 实现 Start, Run ...