首页 > 其他分享 >方法重写

方法重写

时间:2024-08-02 16:52:35浏览次数:12  
标签:重写 Animal 子类 父类 方法 public

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

在上面的例子中可以看到,尽管 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 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();
   }
}

以上实例编译运行结果如下:

TestDog.java:30: cannot find symbol
symbol  : method bark()
location: class Animal
                b.bark();
                 ^

该程序将抛出一个编译错误,因为b的引用类型Animal没有bark方法。

方法的重写规则

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

标签:重写,Animal,子类,父类,方法,public
From: https://www.cnblogs.com/ZWJ7671277/p/18339095

相关文章

  • CentOS 8 和 Ubuntu 20.04.2 LTS 中,您可以通过不同的方法实现在系统启动时自动运行特
    在CentOS8和Ubuntu20.04.2LTS中,您可以通过不同的方法实现在系统启动时自动运行特定指令或脚本。这里是关于两种方法的解释和区别:###方法一:使用`rc-local.service`**CentOS8示例:** $cat/etc/rc.local_my.sh#!/bin/bash/bin/bash-c"ip-6routeadddefaultvi......
  • 苹果(iPhone)越狱,iPhone绕ID越狱,苹果手机越狱方法
    CheckRa1n越狱支持设备:iPhone5S-iPhoneX,兼容系统:iOS12.3~iOS14.8,所以一些iPhone5S以前的老设备(可以通过往期教程老设备越狱)以及iPhoneX以后的新设备都是无法通过heckRa1n越狱,更别说绕ID的,其中iPhoneX以后的新设备目前无法破解ID,某宝、某多的破解ID更多的是硬解换主......
  • 最新SEO自动外链蜘蛛池工具促进百度快速收录使用方法介绍
    此工具集成市面上所有自动外链网站的资源链接,经过合并、去重、筛选、验证总结出最终的外链资源,软件实时更新 本软件将您繁杂的外链推广转为自动化进行,并且加入站群的支持,您只需要将你的站群域名粘贴到软件里,点击开始按钮就可以了 软件会自动轮刷您的每一个网站 软件效......
  • 解决国内 github.com 打不开进不去的方法
    解决国内github.com打不开进不去的方法修改host文件电脑的hosts文件在下面这个地址,找到hosts文件C:\Windows\System32\Drivers\etc右键点击hosts文件,选择复制,然后粘贴到桌面上。右键点击桌面上的hosts文件,选择“用记事本打开该文件”,hosts文件中需要写入下面的访......
  • Markdown的使用方法
    Markdown的使用非常简单。以下是一些基本的Markdown语法,可以帮助你开始使用它来格式化文本。标题在文字前面加上#来创建标题。#的数量代表标题的级别。markdown复制#一级标题##二级标题###三级标题####四级标题#####五级标题######六级标题段落与换......
  • PWN学习过程中一些小问题的解决方法
    一、使用python运行py文件,第一行的frompwnimport*报错File"woof.py",line1,in<module>frompwnimport*ImportError:Nomodulenamedpwn因为使用的是python3安装的pwn,使用Python的话默认使用的是python2,可以直接在终端中输入python查看自己使用的版本。......
  • 方法的作用
    方法的作用目录方法的作用方法定义基本形式方法的重载方法的调用可变参数列表示例方法的作用在Java中,方法(也称为函数)是程序的基本构建块之一,用于执行特定任务。方法有助于组织代码、提高可重用性,并使程序更容易理解和维护。下面是对Java方法的一些基本概念和用法的总结。方法定......
  • gpt分区怎么修复引导?gpt分区修复引导多种方法
              随着uefi+gpt(guid)分区的流行,越来越多的小伙伴经常遇到gpt分区引导丢失的情况,也不知道怎么修复,以前的一些修复工具都只能修复mbr格式下的硬引导,但对于gpt分区引导不是很清楚,gpt分区引导主要是靠分区中的esp分区来启动的,那么如何进行gpt分区修复引导呢?接......
  • windows无法连接到打印机0x0000011b原因分析及完美解决方法
         日常办公和生活中,打印机是不可或缺的重要设备。然而,在添加打印机过程中,经常会遇各种问题。然后我们在添加打印机遇到最多的多种错误:windows无法连接到打印机0x0000011b。0x0000011b有更新补丁导致的、有访问共享打印机服务异常、有访问共享打印机驱动异常等问题导......
  • Cool Request重大更新:可以统计任意方法耗时【送源码】
    什么是CoolRequestCoolRequest是一个IDEA中的接口调试插件,除了可以发起基本的HTTP请求之外,还提供了强大的反射调用能力,可以绕过拦截器,这点广受网友的好评,当然伴随着还有Spring中对@Scheduled注解的调用,以及xxl-job的支持,这是不是很酷(Cool)?什么是Trace我怀着一颗激动的心......