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

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

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. sqlmap.config 配置

    <?xml version="1.0" encoding="utf-8"?> <sqlMapConfig xmlns="http:/ ...

  2. C# 16进制与字符串、字节数组之间的转换(转)

    1.请问c#中如何将十进制数的字符串转化成十六进制数的字符串   //十进制转二进制 Console.WriteLine("十进制166的二进制表示: "+Convert.ToSt ...

  3. RequireJS使用及JS目录规划

    1.RequireJS学习文档: http://www.requirejs.cn/ 2.目录规划(参考:ColUdf.vm) 1)一个完整的html,对应一个js文件,模块js在主页面对应的js文件中 ...

  4. [原]hdu2191 悼念512汶川大地震遇难同胞——珍惜现在,感恩生活 (这个只是题目名字) (多重背包)

    本文出自:http://blog.csdn.net/svitter 原题:http://acm.hdu.edu.cn/showproblem.php?pid=2191 题意:多重背包问题.转换成为01 ...

  5. WCF+EntityFramework+mysql总结

    用WCF+Ef操作Mysql数据库的,现在,写一下经验总结,希望对大家有帮助. 1.需下载并安装MySql Connector Net 6.5.4 2.在ef层和wcf服务层引用dll :Mysql. ...

  6. c#的基础入门回顾

    定义:.net 是平台 c#是语言 .net 可以做什么:winform (QQ软件 电脑管家软件等 桌面应用程序)   . asp.net (淘宝网站,京东网站,当当网站等internet网站) . ...

  7. sqoop的codegen工具

    一.codegen工具的使用 sqoop codegen --connect jdbc:mysql://localhost:3306/test --username root --password 1 ...

  8. Bitmap.Config 详解

    前言 Android是一个内存相当吃紧的系统,那么在做程序的过程中使用内存就需要相当谨慎,而我们接触最大的大对象估计就是Bitmap了,那么下面就根据Bitmap.Config值的介绍来看下Bitma ...

  9. nginx报file not found错误

    查看错误日志 [:q2013/10/20 18:41:40 [error] 27151#0: *106117 FastCGI sent in stderr: "Primary script ...

  10. Noise,Error,wighted pocket Algorithm

    错误衡量(Error Measure) 有两种错误计算方法: 第一种叫0/1错误,只要[预测≠目标]则认为犯错,通常用于分类:通常选择,错误比较大的值作为y˜的值 第二种叫平方错误,它衡量[预测与目标 ...