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 类的方法
   }
}

在上面的例子中可以看到,尽管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();”,得到的正确结果是:

方法的重写规则

  • 参数列表必须完全与被重写方法的相同;
  • 返回类型必须完全与被重写方法的返回类型相同;
  • 访问权限不能比父类中被重写的方法的访问权限更低。例如:如果父类的一个方法被声明为public,那么在子类中重写该方法就不能声明为protected。
  • 父类的成员方法只能被它的子类重写。
  • 声明为final的方法不能被重写。
  • 声明为static的方法不能被重写,但是能够被再次声明。
  • 子类和父类在同一个包中,那么子类可以重写父类所有方法,除了声明为private和final的方法。
  • 子类和父类不在同一个包中,那么子类只能够重写父类的声明为public和protected的非final方法。
  • 重写的方法能够抛出任何非强制异常,无论被重写的方法是否抛出异常。但是,重写的方法不能抛出新的强制性异常,或者比被重写方法声明的更广泛的强制性异常,反之则可以。
  • 构造方法不能被重写。
  • 如果不能继承一个方法,则不能重写这个方法。
时间: 2024-08-06 06:31:56

JAVA类与对象(八)-----重写的相关文章

有关java类、对象初始化的话题,从一道面试题切入

最近在整理东西时,刚好碰到以前看的一道有关java类.对象初始化相关题目,觉得答案并不是非常好(记忆点比较差,不是很连贯).加上刚好复习完类加载全过程的五个阶段(加载-验证-准备-解析-初始化),所以如果周志明大大诚不我欺的话,无论是类加载过程.还是实例化过程的顺序我都已经了然于心了才对. 一道面试题 标题:2015携程JAVA工程师笔试题(基础却又没多少人做对的面向对象面试题) 地址:https://zhuanlan.zhihu.com/p/25746159 该题代码如下: public cl

java类,对象,方法

1,类和对象   在面向对象的概念当中,类(class)是既包括数据又包括作用于数据的一组操作的封装体.类的数据称为成员变量,类对数据的操作称为成员方法.成员变量反映类的状态和特征,成员方法反映类的行为和能力.类的成员变量和方法统称为类的成员.   对象(Object)是类的实例(instance).对象是动态的,拥有生命周期,都会经历一个从创建.运行到消亡的过程.对象与类的关系就像变量与数据类型一样.   类声明 { 修饰符 } class <Classname> { extends <

Java类与对象的课后练习

Java类与对象的课后练习编程题(java2实用教程P111) 这章内容自学完了,在做教材课后其他练习题的时候(只要自己仔细)都没啥问题,但在做最后一道上机编程题的时候问题出现了,在阅读题目的时候自己能感受到的是这道题不难(的确也不难),我也很快写了出来,但运行程序的时候,结果一直不正确,最后改来改去都不对,思路是对的,分步执行的时候也感觉是有个地方出了问题但就是揪不出来,最后又把课本的前面的例子反复的看对比,最后找到了问题: System.out.println("cpu的速度:"+

java类与对象的区别

java类与对象的区别是个老生常谈的问题,刚开始学java的时候就开始接触类和对象,今天来总结一下他们之间的区别. 首先讲讲class和object的区别,其实就是一句话:object是所有class的父类,所有class类都默认继承object. java中类是对一类"事物"的属性和行为一种抽象,比如人类就可以定义为一个Person类: public class Person { public int age;//年龄 public String name;//姓名 public i

Java—类和对象

使用对象的步骤 1.创建对象: 类名 对象名 = new 类名():(对一个类进行实例化 ) 例:Telphone phone =new Telphone(): 2.使用对象:引用对象的属性 对象名.属性 例:phone.screen = 5://给实例对象赋值 引用对象方法: 对象名.方法名(): 例: phone.sendMessage(): 成员变量与局部变量: 直接写在类中供整个类使用的叫成员变量,写在方法中的叫局部变量 1.局部变量作用域不同,成员变量可作用于整个类,局部变量作用于定义

java类和对象详解

对象和类详解 什么是对象:万物皆对象,什么东西都是对象,例如,猫狗人 什么是类:类是同一事物的统称,它描述一类对象的行为和状态. 设计类:抽象过程 类的属性 类的方法 什么是实例化:由类得到对象这个过程叫做实例化 对象和类的区别:一个是抽象一个是具体,一个是集合一个是个体等等.一个是魔板一个是实例,一个是数据一个是数据结构等等. 如何设计类:public class student{}//把类的共同提出提取出来, 学生会有什么:名字,年龄,性别,等等,这就是共同特征. //共同特征为类的属性,共

Java类和对象编程示例

一.Java类的定义和对象的创建 1.定义一个Circle圆类. (1)一个名为radius的double型数据域,表示圆的半径,其默认值为1. (2)创建默认圆的无参构造方法. (3)一个创建radius为指定值的圆的构造方法. (4)数据域radius的访问器和修改器. (5)一个名为getArea()的方法返回这个圆的面积. (6)一个名为getPerimeter()的方法返回周长. class Circle { private double radius=1; public Circle

Java——类、对象与继承

今天我们谈的是――类与对象.类的继承. 2019-08-25 17:22:35 目录怎样定义类,对象又是什么?类在Java中有什么存在的意义?继承在Java中有何重要意义?继承了什么? 类.对象 要理解类的定义,我们首先来了解一下对象是什么.所谓对象,就是现实生活中真真实实存在的事物,例如这个鼠标,这个学生,这个茶杯等等…而类就是对这些真实存在的事物进行一个抽象.我们把具有相同特征的一些对象抽象成为同一个复本,那么这个复本就叫作类.类具有这些对象的相同特征.例如学生这个类(因为不是特指,所以是类

Java —类和对象

类和对象 类是对象的类型,是具有相同的属性和方法的一组对象的集合. 定义类 访问修饰符 class 类名 { 数据类型 属性名: 访问修饰符 返回值类型 方法名 {} } 创建对象:类名 对象名 = new 类名(); 使用对象:引用对象的属性:对象名.属性名;引用对象的方法:对象名.方法名(); 可以基于一个类创建多个该类的对象,每个对象都拥有自己的成员,互相独立. 成员变量和局部变量 成员变量:在类中定义,描述对象将要有什么.可以在本类的方法或其他类的方法中使用.java会给成员变量一个初始

JAVA类与对象作业——动手动脑以及课后实验性问题

一: 1.源代码 //MAO2015.10.6 //foo class Foo { int value; public Foo(int initValue) { value = initValue; } } public class Test2 { public static void main(String[] args) { Foo obj1 = new Foo(2); } } 2.截图 3.总结 如果一个类提供自定义的构造方法,导致系统不再提供默认构造方法. 二: 1.源代码 //mao2