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 层次来 ...
随机推荐
- 多行文字垂直居中(完美兼容chrome firefox IE6 7 8 9)
在说到这个问题的时候,也许有人会问CSS中不是有vertical-align属性来设置垂直居中的吗?即使是某些浏览器不支持我只需做少许的CSS Hack技术就可以啊!所以在这里我还要啰嗦两句,CSS中 ...
- mem中需找特定字符
memstr //find 'substr' from a fixed-length buffer //('full_data' will be treated as binary data buff ...
- Android IOS WebRTC 音视频开发总结(六三)-- 2016国内IM云服务行业分析
本文主要国内IM云服务行业分析,文章最早发表在我们的微信公众号上,详见这里,欢迎关注微信公众号blackerteam,更多详见www.blackerteam.com 谈到IM我们最先想到的是qq和微信 ...
- 为什么for in循环不适合用于数组
首先一点无关的,使用(var i in a) 而不是( i in a),除非你想创建全局变量. 第二点,for in 循环会忽略空的数组 var a = []; a[5] = 5; // Perfec ...
- 记一次动态调用WebService
这次的使用参考博客园中的ID是 生命不息,折腾不止 http://www.cnblogs.com/leolion/p/4757320.html ,感谢分享 博客园让自己慢慢的成长,少不了这些无私奉献 ...
- C#中补0
C#中补0 编写人:CC阿爸 2014-3-16 首先先增加两个左补齐又补齐的函数 #region 该函数动态添加空格,对齐小票 public string AddSpace(string text ...
- c语言学习的第10天
#include <stdio.h> int main() { int many; printf("你想看几次?"); scanf("%d",&am ...
- RecyclerView的基本创建
线性显示 类似于listview: 线性宫格显示 类似于grid view: 用线性宫格显示 类似于瀑布流: 结构图: 测试代码: activity_main.xml: <RelativeLay ...
- OVER Clause是个好东西,常和ROW_NUMBER()、Sum、AVG、Count、Min、Max配合使用
根据SQL官方帮助的实例: USE AdventureWorks2012; GO SELECT ROW_NUMBER() OVER(PARTITION BY PostalCode ORDER BY S ...
- 关于delphi XE7中的动态数组和并行编程(第一部分)
本文引自:http://www.danieleteti.it/category/embarcadero/delphi-xe7-embarcadero/ 并行编程库是delphi XE7中引进的最受期待 ...