重写:子类对父类的允许访问的方法的实现过程进行重新编写!返回值和形参都不能改变。即:外壳不变,核心重写!

好处:可以根据子类的需要,定义特定于自己的行为。也就是说子类能够根据需要实现父类的方法。

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类与对象(八)-----重写的更多相关文章

  1. Java类和对象初始化

    类的生命周期: Java类的初始化: 本阶段负责为类变量赋正确的初始值.(类变量即静态变量) Java编译器把所有的类变量初始化语句和静态初始化器通通收集到<clinit>方法中,该方法只 ...

  2. java类和对象之间的差

    java类和对象之间的差别是一个普遍的问题,刚开始学习java当它来到与类和对象接触.今天就来总结一下它们之间的差异. 先说说class和object差异.事实上,词:object是全部class的父 ...

  3. 危险代码:如何使用Unsafe操作内存中的Java类和对象

    危险代码:如何使用Unsafe操作内存中的Java类和对象—Part1 危险代码:如何使用Unsafe操作内存中的Java类和对象—Part2 危险代码:如何使用Unsafe操作内存中的Java类和对 ...

  4. [Java初探08]__简单学习Java类和对象

    前言 在前面的学习中,我们对面向对象的编程思想有了一个基本的了解,并且简单的了解了类和对象的定义.那么类和对象在Java语言中是如何表现的,这次,就从实际出发,学习一下一下类和对象在Java语言中的使 ...

  5. java类和对象

    类是对象的抽象 对象是类的一个实例类 对象 = new 类();拿对象可以操作这个类里的方法 java类与对象的区别是个老生常谈的问题,刚开始学java的时候就开始接触类和对象,今天来总结一下他们之间 ...

  6. JAVA类与对象(九)------多态

    多态是同一个行为具有多个不同表现形式或形态的能力.多态性是对象多种表现形式的体现. 多态存在的三个必要条件: 继承 重写 父类引用指向子类对象 例:Parent p = new Child(); 当使 ...

  7. java类与对象的动手动脑和其他小问题

    在Java中,我们可以通过组合一私有字段和一对get/set方法来定义一个属性.私有的变量,共有的方法. package sample; /** * 自定义Java类的示例 */ class MyCl ...

  8. JAVA类和对象创建

    面向对象 学习目标: 理解面向对象的编程思想 理解类与对象的关系 如何创建类与对象 方法重载 一:什么是面向对象编程(OOP) 面向对象编程(Object Oriented Programming,O ...

  9. Java 类和对象3

    编写Java应用程序.首先,定义描述学生的类——Student,包括学号(int).姓名(String).年龄(int)等属性:二个方法:Student(int stuNo,String name,i ...

  10. 解析Java类和对象的初始化过程

    类的初始化和对象初始化是 JVM 管理的类型生命周期中非常重要的两个环节,Google 了一遍网络,有关类装载机制的文章倒是不少,然而类初始化和对象初始化的文章并不多,特别是从字节码和 JVM 层次来 ...

随机推荐

  1. hdu1150

    [ Reprinted ]最小点覆盖=最大二分匹配数 url: http://zhidao.baidu.com/link?url=ZMzk27V8P99KQN63DpVsE2fd1YBIk7Jg83E ...

  2. 《Linux运维趋势》2010-2013年全部期刊下载

    <Linux运维趋势>2010.rar <Linux运维趋势>2011_上.rar <Linux运维趋势>2011_下.rar <Linux运维趋势>2 ...

  3. Hive[4] 数据定义 HiveQL

    HiveQL 是 Hive 查询语言,它不完全遵守任一种 ANSI SQL 标准的修订版,但它与 MySQL 最接近,但还有显著的差异,Hive 不支持行级插入,更新和删除的操作,也不支持事务,但 H ...

  4. zencart安装第三步出现空白

    问题描述:在安装zencart时,在第三步同意协议,然后点击下一步时,页面经过漫长的等待后就显示空白. 解决方法:打开php.ini,将max_execution_time = 30 -> ma ...

  5. zend studio导入thinkphp的乱码问题

    刚刚导入thinkphp有乱码还有错误怎么办? windows -> preference -> Work space -> text file encodeing设置为 UTF-8 ...

  6. Uva12504 Updating a Dictonary

    这道题难度不大,主要是考察熟练运用C++的容器,字符串等操作. 另外注意特殊情况是否需要特殊处理.即当一个字典为空时,无论另一个字典是否有值,输出的结果都为No Change,这点需要注意一下. 另外 ...

  7. javascript组件化(转)

    javascript组件化(转) By purplebamboo 3月 16 2015 更新日期:3月 23 2015 文章目录 1. 最简陋的写法 2. 作用域隔离 3. 面向对象 4. 抽象出ba ...

  8. mariadb的explain分析及InnoDB存储引擎

    id: 当前查询语句中,每个SELECT语句的编号,     id: 1  表示简单类型的查询 复杂类型的查询有三种:简单子查询,用于FROM中的子查询,联合查询:UNION 注意:UNION查询的分 ...

  9. HTTP协议中PUT/GET/POST/HEAD等介绍

    HTTP协议中GET.POST和HEAD的介绍 GET: 请求指定的页面信息,并返回实体主体. HEAD: 只请求页面的首部. POST: 请求服务器接受所指定的文档作为对所标识的URI的新的从属实体 ...

  10. PHP上传图片如何防止图片木马?

    segmentfault回答: http://segmentfault.com/q/1010000000507750 一. 其实识别图片木马是很困难的,可以在一张正常的图片里加入一句话木马. 但是只要 ...