当前位置: 首页 > article >正文

【新手向】从零开始学习Java(Day17)重写、重载与多态

每天二十分钟,成就Java大神,点点关注不迷路!

今天是第十七天,给坚持到这里的小伙伴点个赞!

发掘自我的唯一方法就是去尝试,共勉!


 

目录

重写(Override)

方法重写的规则

 重载(Overload)

方法重载的规则

重写与重载的区别

多态

多态的优点

多态存在的三个必要条件

下节预告


重写(Override)

重写(Override)是指子类定义了一个与其父类中具有相同名称、参数列表和返回类型的方法,并且子类方法的实现覆盖了父类方法的实现。 即外壳不变,核心重写!

重写的好处在于子类可以根据需要,定义特定于自己的行为。也就是说子类能够根据需要实现父类的方法。这样,在使用子类对象调用该方法时,将执行子类中的方法而不是父类中的方法

重写方法不能抛出新的检查异常或者比被重写方法申明更加宽泛的异常。例如: 父类的一个方法申明了一个检查异常 IOException,但是在重写这个方法的时候不能抛出 Exception 异常,因为 Exception 是 IOException 的父类。它只能抛出 IOException 异常或者 IOException 的子类异常。

class Animal{
    public void move(){
       System.out.println("动物可以移动");
    }
}
  
 class Dog extends Animal{
    public void move(){
       System.out.println("狗可以跑和走");
    }
}
  
 public class TestDog{
    public static void main(String args[]){
       Animal a = new Animal(); // Animal 对象
       Animal b = new Dog(); // Dog 对象
  
       a.move();// 执行 Animal 类的方法
  
       b.move();//执行 Dog 类的方法
    }
}

在上面的例子中,之所以能编译成功,是因为 Animal 类中存在 move 方法,然而运行时,运行的是特定对象的方法,下面的例子中,由于Animal 类中不存在bark 方法,运行时会抛出编译错误。

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 TestDog{
   public static void main(String args[]){
      Animal a = new Animal(); // Animal 对象
      Animal b = new Dog(); // Dog 对象
 
      a.move();// 执行 Animal 类的方法
      b.move();//执行 Dog 类的方法
      b.bark();
   }
}

方法重写的规则

  1. 重写方法的参数列表与被重写方法的参数列表必须完全相同

  2. 返回类型与被重写方法的返回类型可以不相同但是必须是父类返回值的派生类(java5 及更早版本返回类型要一样,java7 及更高版本可以不同)。

  3. 访问权限不能比父类中被重写的方法的访问权限更低。例如:如果父类的一个方法被声明为 public,那么在子类中重写该方法就不能声明为 protected。

  4. 声明为 final 的方法不能被重写

  5. 声明为 static 的方法不能被重写,但是能够被再次声明

  6. 子类和父类在同一个包中,那么子类可以重写父类默认方法和声明为 public 、 protected 的非 final 方法

  7. 子类和父类不在同一个包中,那么子类只能够重写父类的声明为 public 和 protected 的非 final 方法

  8. 重写的方法能够抛出任何非强制异常,无论被重写的方法是否抛出异常。但是,重写的方法不能抛出新的强制性异常,或者比被重写方法声明的更广泛的强制性异常,反之则可以。

  9. 构造方法不能被重写

  10. 如果不能继承一个类,则不能重写该类的方法


 重载(Overload)

重载(overloading) 是在一个类里面,方法名字相同,而参数不同。返回类型可以相同也可以不同

每个重载的方法(或者构造函数)都必须有一个独一无二的参数类型列表

方法重载的规则

  1. 被重载的方法必须改变参数列表(参数个数或类型不一样)。
  2. 被重载的方法可以改变返回类型。
  3. 被重载的方法可以改变访问修饰符
  4. 被重载的方法可以声明新的或更广的检查异常
  5. 方法能够在同一个类中或者在一个子类中被重载。

重写与重载的区别

区别点重载方法重写方法
参数列表必须修改一定不能修改
返回类型可以修改一定不能修改
异常可以修改可以减少或删除,一定不能抛出新的或者更广的异常
访问可以修改一定不能做更严格的限制(可以降低限制)

方法的重写(Overriding)和重载(Overloading)是java多态性的不同表现,重写是父类与子类之间多态性的一种表现,重载可以理解成一个类中的多态表现形式(但重载不是多态,下文解释)。


多态

多态是同一个行为具有多个不同表现形式或形态的能力,或者说同一个接口,使用不同的实例而执行不同操作。

比如我们按下 F1 键这个动作:

  • 如果当前在 Flash 界面下弹出的就是 AS 3 的帮助文档;
  • 如果当前在 Word 下弹出的就是 Word 帮助;
  • 在 Windows 下弹出的就是 Windows 帮助和支持。

同一个事件发生在不同的对象上会产生不同的结果。

多态的优点

消除类型之间的耦合关系:调用方只需关注父类接口,无需关心具体子类

可替换性

可扩充性

接口性

灵活性

简化性

多态存在的三个必要条件

  1. 继承
  2. 重写
  3. 向上转型:即父类引用指向子类对象:Parent p = new Child();在编译时表现为父类类型,但运行时实际执行的是子类方法。
// 父类
class Animal {
    public void sound() {
        System.out.println("动物发出声音");
    }
}

// 子类重写方法
class Dog extends Animal {
    @Override// 伪代码,表示这是一个重写方法,可以不写
    public void sound() {
        System.out.println("狗叫:汪汪");
    }
}

public class TestPolymo {
    public static void main(String[] args) {
        Animal animal = new Dog();// 向上转型:Animal 类型引用指向 Dog 对象
        animal.sound(); // 输出:狗叫:汪汪(实际调用子类方法)
    }
}

@Override是伪代码,表示这是一个重写方法,可以不写;实战中常常写上方便阅读。


下节预告

下节开始,笔者将详细展开介绍 Java 中的抽象类和封装,看到这里的小伙伴可以投票打卡(投票有效期为7天),有疑惑可私信或评论区提出,and不妨动动发财的手点个赞吧,明天见!


http://www.kler.cn/a/569729.html

相关文章:

  • java容器 LIst、set、Map
  • SpringCloud常用企业级别框架整合--上篇
  • Notepad++下载地址【亲测好用】
  • 【0005】Python变量详解
  • 25西医研究生复试面试问题汇总 西医专业知识问题很全! 西医试全流程攻略 西医考研复试调剂真题汇总
  • 【子网掩码计算器:Python + Tkinter 实现】
  • 机器学习数学基础:35.效度
  • Unix Domain Socket和eventfd
  • Minio搭建并在SpringBoot中使用完成用户头像的上传
  • 【机器学习】Logistic回归#1基于Scikit-Learn的简单Logistic回归
  • Element Plus中el-tree点击的节点字体变色加粗
  • chromadb向量数据库使用 (1)
  • 【漫话机器学习系列】114.逻辑 Sigmoid 函数
  • golang 内存对齐和填充规则
  • Redis Desktop Manager(Redis可视化工具)安装及使用详细教程
  • GPU运维常用命令
  • 云原生监控篇——全链路可观测性与AIOps实战
  • centos 7 停更后如何升级kernel版本 —— 筑梦
  • JMeter 使用 CSV 及随机 ID 进行登录与增删改查示例
  • LeetCode 模拟章节 (持续更新中)