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 层次来 ...
随机推荐
- html5 图片转base64预览显示
<!DOCTYPE HTML> <html> <head> <meta charset="utf-8"> <title> ...
- 操作系统模仿CMD
实验一.命令解释程序的编写 专业:商软(2)班 姓名:列志华 学号:201406114254 一. 实验目的 (1)掌握命令解释程序的原理: (2)掌握简单的DOS调用方法: (3 ...
- SQL更新表的字段
Oracle: alter table CAPIAGENTLOG modify(clientcode nvarchar2()) SQL Server: alter table CAPIAGENTLOG ...
- hdu 2255 奔小康赚大钱 KM算法
看到这么奇葩的题目名我笑了,后来这么一个裸的KM调了2小时我哭了…… 这是个裸的KM算法,也没什么多说的,主要是注意多组数据时,每次都要把各种数组清空啊,赋值啊什么的,反正比较麻烦.至于为什么调了2小 ...
- HLS入门收集(1)
使用HLS各种问题 关于求指数函数 exp(x) 在HLS中使用exp(x),也就是指数函数.不能导出RTL到EDK也就是Pcore 只能导出为VIVADO IP:相关解释:见官方论坛 http:/ ...
- jquery加载页面的方法(页面加载完成就执行)
jquery加载页面的方法(页面加载完成就执行),建议大家看下windows.onload与$(document).ready之间的区别. 1.$(function(){ $("#a&qu ...
- WAMP搭建
win2003Apache+PHP+Mysql+PHPmyadmin 软件版本: Apacheèhttpd-2.2.25-win32-x86-no_ssl.msi php-5.4.3-Win32-VC ...
- Index of my articles
65:一个表格说明RelativeLayout中的几个重要属性[Written By KillerLegend] (2013-10-16 21:59) 64:win7修改软件[授权给…]后面的名称 ( ...
- U6会计科目导入致对账不平
一个客户,用的是U6版本,想将己使用的账套的科目导入新建的账套中,本想用用友本身自带的总账工具导入,发现导不了.没办法,只能打开数据库,手工导入. 月末结账时,发现对账不平.问题是余额表与明细不平,大 ...
- List集合实战总结
//构造被分隔的集合 List<object> list = new List<object>(); for (int i = 0; i <= 100; i++) { l ...