重写也称为覆盖, 是指子类与父类的方法名相同但是可以有不同的权限(子类权限需大于父类),返回值(J2SE 5.0以后增加的功能,且子类的返回值必须是父类返回值的子类)或者方法实现。

重写体现了子类补充或者改变父类方法的能力, 通过重写, 可以使一个方法在不同的子类中表现出不同的行为。

public class Animal {

protected void cry(){

System.out.println("animal crying")

}

}

public class Cat exrends Animal{

@Override

public void Cry(){

System.out.println("Cat crying")

}

}

需要注意的是, 重写方法不能声明比被重写方法更宽泛的检查异常, 比如父类方法中声明了IOException, 那么子类重写方法只能申明IOException或者其子类或者不声明, 不能声明Exception

why?  因为try  catch的时候,只能捕获到父类声明的异常范围

存疑: 在kotlin中, 下面代码并没有报错, 难道kotlin中可以?

open class Animal {
open fun cry(){
println("cry...")
throw IOException()
}
}

class Dog: Animal() {
override fun cry(){
println()
throw Exception()
}
}

class Test {
val dog = Dog()

fun test(){
try {
dog.cry()
} catch (e: Exception){

}
}
}

子类可以继承父类的非私有成员变量和成员方法, 但是如果子类声明的成员变量与父类的同名, 则子类不能继承父类的成员变量, 此时称子类的成员变量隐藏了父类的成员变量。

如果子类声明的成员方法与父类的同名, 且方法返回值,参的个数和类型都相同, 则称为子类重写了父类的成员方法 。

这时, 如果子类想要访问父类的成员变量/成员方法, 就需要用到super关键字

声明为static/ final的方法 (private也属于final) 不能被子类重写

因为这部分方法是静态绑定的, 编译器一开始就能确定要调用的版本, 并且在整个运行期间是不可变的, 在类加载的时候就会把符号引用转化为该方法的真正引用, 并不具有多态性

与之对应, 在程序运行期间才确定调用版本的方法叫做动态绑定,此时,虚拟机会为每个类创建一个方法表, 列出所有方法的签名和实际调用的方法,这样一来,虚拟机运行时只需要查找该表就行了。 只有动态绑定的方法才具有多态性。

当然我们可以在子类中声明一个和父类同样方法名的static方法, 但它实际上和父类的方法是两个互不相干的方法

重构: 是指子类与父类方法名相同但方法实现不同。 重构是特殊的重写

public class Dog exrends Animal{

@Override

protected void Cry(){

System.out.println("Dog crying")

}

}

重载: 发生在同一个类之间。 同一个类中,同名方法的参数类型/个数/顺序不同

最常见的重载就是构造方法, 因为构造方法的名称已经由类名确定, 那么如果希望以不同的方式来实例化对象,就必然要用到方法重载

重载以参数来区分方法,返回类型可同可不同, 但参数必须不同

public class Wolf exrends Animal{

@Override

protected void Cry(){

System.out.println("Dog crying")

}

protected void eat(String meat){

System.out.println("Wolf eat:" + meat)

}

protected void eat(String meat, String water){

System.out.println("Wolf eat:" + meat+ ", and drink: "+water)

}

}

Java基础- 重写,重构和重载的更多相关文章

  1. Java基础:多态(重载和重写)

    转载请注明出处:jiq•钦's technical Blog (1)域与静态方法 记住"仅仅有普通方法的调用是多态的". 而域和静态方法不是:对于域的訪问.在编译期间就已经进行解析 ...

  2. Java面向对象---重写(Override)与重载(Overload)

    一.重写(Override) 重写是子类对父类的允许访问的方法的实现过程进行重新编写, 返回值和形参都不能改变.即外壳不变,核心重写! 重写的好处在于子类可以根据需要,定义特定于自己的行为. 也就是说 ...

  3. Java方法重写与方法重载

    方法重载:发生在同一个类中,方法名相同方法形参列表不同就会重载方法. 方法重写:发生在继承当中,如果子的一个类方法与父类中的那个方法一模一样(方法名和形参列表一样),那么子类就会重写父类的方法. 方法 ...

  4. java中,重构、重载、重写

    1.什么叫重构? 答:重构(Refactoring)就是通过调整程序代码改善软件的质量.性能,使其程序的设计模式和架构更趋合理,提高软件的扩展性和维护性,系统发展到一定阶段后,使用重构的方式,不改变系 ...

  5. Java基础--重写(Overriding,覆盖)-重载(Overloading)

    多态性: Java的方法重载,就是在类中可以创建多个方法,它们具有相同的名字,但具有不同的参数和不同的定义.调用方法时通过传递给它们的不同参数个数和参数类型来决定具体使用哪个方法 Java的方法重写, ...

  6. Java基础-重写方法

    一般我们需要在新类上重写,两个类的实现: class Animal{ public void move(){ System.out.println("动物可以移动"); } } c ...

  7. 黑马程序员——JAVA基础之函数,重载,内存结构

      ------- android培训.java培训.期待与您交流! ---------- 函数: 什么是函数? • 函数就是定义在类中的具有特定功能的一段独立小程序. • 函数也称为方法. 函数的格 ...

  8. 14.Java基础_函数/函数重载/参数传递

    Java函数和函数重载 /* 函数定义: public static 返回类型 func(参数){ 方法体: } 函数重载 在调用时,Java虚拟机会通过参数的不同来区分同名的函数 满足: 1.多个函 ...

  9. 三、java基础-方法含义_重载_递归

    1.java中方法: 方法的含义: 就是一个代码片段,可以完后某个特定的功能,可以重复利用: 定义方法的语法: [方法的修饰符列表]   方法的返回值类型   方法名{    java语句; } 注意 ...

随机推荐

  1. 用vue的抽象组件来做一个防止img标签url为空或url地址出错的验证

    看了网上文章学习了下vue的抽象组件,感觉就跟react的高阶组件一样的使用场景,只是更加面向vue的底层编程 ,网上介绍的抽象组件一般有2种用法,1 用来加防抖和节流 2 用来控制按钮是否允许点击做 ...

  2. 移动端动画——requestAnimationFrame

    window.requestAnimationFrame() 告诉浏览器--你希望执行一个动画,并且要求浏览器在下次重绘之前调用指定的回调函数更新动画.该方法需要传入一个回调函数作为参数,该回调函数会 ...

  3. Linux Ubuntu SVN图形界面 安装使用

    安装 sudo apt-get install rapidsvn 使用 rapidsvn

  4. You have mail in /var/mail/xxx

    因为配置 DDNS, 我添加了个 crontab 定时任务,每隔 1 分钟执行一段 python 脚本 然后就发现 terminal 经常提示 'You have mail in /var/mail/ ...

  5. Sentry For React 完整接入详解(2021 Sentry v21.8.x)前方高能预警!三万字,慎入!

    内容源于:https://docs.sentry.io/platforms/javascript/guides/react/ 系列 1 分钟快速使用 Docker 上手最新版 Sentry-CLI - ...

  6. freeswitch的event事件处理

    概述 之前的文章中,我们讲解了freeswitch的源码基本结构,如何新增一个插件式模块,以及如何在模块中新增一个命令式API接口和APP接口. freeswitch本身是事件驱动的,它可以并发响应多 ...

  7. SQL语句之高级使用

    1.select top select top  用于规定要返回的数据的数目 注意:并非所有的数据库系统都支持 SELECT TOP 语句. MySQL 支持 LIMIT 语句来选取指定的条数数据, ...

  8. 痞子衡嵌入式:MCUXpresso IDE下将应用程序RW段分散链接的几种方法

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是MCUXpresso IDE下将应用程序RW段分散链接的几种方法. 早期的 MCU 芯片,一般都会嵌入内部 Flash 和 RAM,并且 ...

  9. SQL Server 使用bcp进行大数据量导出导入

    转载:http://www.cnblogs.com/gaizai/archive/2010/04/17/1714389.html SQL Server的导出导入方式有: 在SQL Server中提供了 ...

  10. pytest+allure基础知识

    介绍 pytest是基于unittest开发的另一款更高级更好用的单元测试框架 支持参数化 执行测试过程中可以将某些测试跳过(skip),或者对某些预期失败的case标记成失败 支持运行由 nose, ...