四. Java继承和多态3. 继承中的方法的覆盖和重载

在类继承中,子类可以修改从父类继承来的方法,也就是说子类能创建一个与父类方法有不同功能的方法,但具有相同的名称、返回值类型、参数列表。

如果在新类中定义一个方法,其名称、返回值类型和参数列表正好与父类中的相同,那么,新方法被称做覆盖旧方法。

参数列表又叫参数签名,包括参数的类型、参数的个数和参数的顺序,只要有一个不同就叫做参数列表不同。

被覆盖的方法在子类中只能通过super调用。

注意:覆盖不会删除父类中的方法,而是对子类的实例隐藏,暂时不使用。

请看下面的例子:

  1. public class Demo{
  2. public static void main(String[] args) {
  3. Dog myDog = new Dog("花花");
  4. myDog.say(); // 子类的实例调用子类中的方法
  5. Animal myAnmial = new Animal("贝贝");
  6. myAnmial.say(); // 父类的实例调用父类中的方法
  7. }
  8. }
  9. class Animal{
  10. String name;
  11. public Animal(String name){
  12. this.name = name;
  13. }
  14. public void say(){
  15. System.out.println www.zenmebanw.com ("我是一只小动物,我的名字叫" + name + ",我会发出叫声");
  16. }
  17. }
  18. class Dog extends Animal{
  19. // 构造方法不能被继承,通过super()调用
  20. public Dog(String name){
  21. super(name);
  22. }
  23. // 覆盖say() 方法
  24. public void say(){
  25. System.out.println("我是一只小狗,我的名字叫" + name + ",我会发出汪汪的叫声");
  26. }
  27. }

运行结果:
我是一只小狗,我的名字叫花花,我会发出汪汪的叫声
我是一只小动物,我的名字叫贝贝,我会发出叫声

方法覆盖的原则:

  • 覆盖方法的返回类型、方法名称、参数列表必须与原方法的相同。
  • 覆盖方法不能比原方法访问性差(即访问权限不允许缩小)。
  • 覆盖方法不能比原方法抛出更多的异常。
  • 被覆盖的方法不能是final类型,因为final修饰的方法是无法覆盖的。
  • 被覆盖的方法不能为private,否则在其子类中只是新定义了一个方法,并没有对其进行覆盖。
  • 被覆盖的方法不能为static。如果父类中的方法为静态的,而子类中的方法不是静态的,但是两个方法除了这一点外其他都满足覆盖条件,那么会发生编译错误;反之亦然。即使父类和子类中的方法都是静态的,并且满足覆盖条件,但是仍然不会发生覆盖,因为静态方法是在编译的时候把静态方法和类的引用类型进行匹配。

方法的重载:
前面已经对Java方法重载进行了说明,这里再强调一下,Java父类和子类中的方法都会参与重载,例如,父类中有一个方法是 func(){ ... },子类中有一个方法是 func(int i){ ... },就构成了方法的重载。

覆盖和重载的不同:

    • 方法覆盖要求参数列表必须一致,而方法重载要求参数列表必须不一致。
    • 方法覆盖要求返回类型必须一致,方法重载对此没有要求。
    • 方法覆盖只能用于子类覆盖父类的方法,方法重载用于同一个类中的所有方法(包括从父类中继承而来的方法)。
    • 方法覆盖对方法的访问权限和抛出的异常有特殊的要求,而方法重载在这方面没有任何限制。
    • 父类的一个方法只能被子类覆盖一次,而一个方法可以在所有的类中可以被重载多次。
时间: 2024-08-23 20:06:31

四. Java继承和多态3. 继承中的方法的覆盖和重载的相关文章

java学习中,面向对象的三大特性:封装、继承、多态 以及 super关键字和方法的重写(java 学习中的小记录)

java学习中,面向对象的三大特性:封装.继承.多态 以及 super关键字和方法的重写(java 学习中的小记录) 作者:王可利(Star·星星) 封装     权限修饰符:public 公共的,private 私有的     封装的步骤:          1.使用private 修饰需要封装的成员变量.          2.提供一个公开的方法设置或者访问私有的属性              设置 通过set方法,命名格式:     set属性名();  属性的首字母要大写 访问 通过ge

四. Java继承和多态1. 继承的概念与实现

继承是类与类之间的关系,是一个很简单很直观的概念,与现实世界中的继承(例如儿子继承父亲财产)类似. 继承可以理解为一个类从另一个类获取方法和属性的过程.如果类B继承于类A,那么B就拥有A的方法和属性. 继承使用 extends 关键字. 例如我们已经定义了一个类 People: class People{ String name; int age; int height; void say(){ System.out.println("我的名字是 " + name + ",年

5.Java继承中方法的覆盖和重载

在类继承中,子类可以修改从父类继承来的方法,也就是说子类能创建一个与父类方法有不同功能的方法,但具有相同的名称.返回值类型.参数列表. 如果在新类中定义一个方法,其名称.返回值类型和参数列表正好与父类中的相同,那么,新方法被称做覆盖旧方法. 参数列表又叫参数签名,包括参数的类型.参数的个数和参数的顺序,只要有一个不同就叫做参数列表不同. 被覆盖的方法在子类中只能通过super调用. 注意:覆盖不会删除父类中的方法,而是对子类的实例隐藏,暂时不使用. 请看下面的例子: public class D

面向对象编程思想 以及 封装,继承,多态 和 python中实例方法,类方法,静态方法 以及 装饰器

一.什么是面向对象编程? 目前主流的两大软件开发方式有两种,面向过程 和 面向对象. 具体什么意思,看别人写好的博客:https://baijiahao.baidu.com/s?id=1626333751993181194&wfr=spider&for=pc(如何给女朋友解释什么是面向对象编程) 二.动态编程语言中的核心 -- 封装,继承和多态 核心定义:把一组数据结构和处理他们的方法成为 对象,把具有相同行为的对象称为 类.通过 封装 隐藏内部细节,通过 继承 实现类的特化和泛化,通拓

使用Java的反射功能调用类中的方法

最近一直在搞Java的反射,今天使用反射调用方法时出现了很多问题,主要是没有详细参考官方API.所以走了很多弯路. 所以想把这个例子记下来,供自己也供他人学习. package com.mine.practice.reflect; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; /** * 使用反射调用类中的方法 * @author 2014-11-5 上午10:51:28

廖雪峰Java2面向对象编程-3继承和多态-1继承

1.继承 继承是一种代码复用的方式. Student与Person有相同部分的代码. Student可以从Person继承,这样Student获得了Person的所有功能,只需要编写新增的功能即可.通过继承,可以实现代码的复用. 继承使用关键字extends,一个类只能有一个父类. 如果没有写明继承类,编译器会自动指定该类继承于基类Object. Person:超类super,父类,基类 Student:子类subclass,扩展类 Person.java //默认继承Object public

OC语言学习 (六) 继承、多态,构造方法,description方法

声明父类Animal继承自NSObject Animal.h #ifndef oc_Animal_h #define oc_Animal_h @interface Animal : NSObject { @public int weight; } - (void)eat; //重写默认构造方法 - (id) init; //自定义构造方法 - (id) initWithWeight:(int)newWeight; @end #endif Animal.m #import <Foundation/

Java基础-重写-子类重写父类中的方法后执行情况

代码 public class Test { public static void main(String[] args) { Shape shape = new Circle(); System.out.println(shape.name); shape.printType(); shape.printName(); } } class Shape { public String name = "shape"; public Shape(){ System.out.println(

父类中的方法被覆盖以及子类调用父类覆盖的方法

覆盖 override 覆盖是指在有继承关系的类中,子类中实现了与基类同名的方法,在子类的实例调用该方法时,实际调用的是 子类中的覆盖版本,这种现象叫做覆盖 调用super 函数的两个方法: 1.super(cls, obj) 返回绑定超类的实例(要求obj必须是cls类型的实例) 2.super() 返回绑定超类的实例,等同于: super(__class__, 实例方法的第一个参数), 必须在方法内调用 作用: 可以用super() 返回的实例间接调用其父类的覆盖方法 class A: de