方法的重载(overload)和覆盖(override)

有的时候,类的同一种功能有多种实现方式,到底采用哪种实现方式,取决于调用者给定的参数。例如我们最常用的System.out.println()能够打印出任何数据类型的数据,它有多种实现方式。运行时,Java虚拟机先判断给定参数的类型,然后决定执行哪个println()方法。

重载(overload):对于类的方法(包括从父类中继承的方法),方法名相同,参数列表不同的方法之间就构成了重载关系。这里有两个问题需要注意:

(1)       什么叫参数列表?参数列表又叫参数签名,指三样东西:参数的类型,参数的个数,参数的顺序。这三者只要有一个不同就叫做参数列表不同。

(2)       重载关系只能发生在同一个类中吗?非也。这时候你要深刻理解继承,要知道一个子类所拥有的成员除了自己显式写出来的以外,还有父类遗传下来的。所以子类中的某个方法和父类中继承下来的方法也可以发生重载的关系。

大家在使用的时候要紧扣定义,看方法之间是否是重载关系,不用管方法的修饰符和返回类型以及抛出的异常,只看方法名和参数列表。而且要记住,构造器也可以重载。

覆盖 (override):也叫重写,就是在当父类中的某些方法不能满足要求时,子类中改写父类的方法。当父类中的方法被覆盖了后,除非用super关键字,否则就无法再调用父类中的方法了。

发生覆盖的条件:

1、“三同一不低” 子类和父类的方法名称,参数列表,返回类型必须完全相同,而且子类方法的访问修饰符的权限不能比父类低。

注:JavaSE5中添加了协变返回类型,即子类中覆盖方法可以返回基类中被覆盖方法所返回类型的子类类型。如:基类中的被覆盖方法返回类型为Shape,Circle为Shape         的子类,则子类中的覆盖方法getArea()可以返回Circle类型。此时返回类型不相同。

2、子类方法不能抛出比父类方法更多的异常。即子类方法所抛出的异常必须和父类方法所抛出的异常一致,或者是其子类,或者什么也不抛出;

3、被覆盖的方法不能是final类型的。因为final修饰的方法是无法覆盖的。

4、被覆盖的方法不能为private。否则在其子类中只是新定义了一个方法,并没有对其进行覆盖。

5、被覆盖的方法不能为static。所以如果父类中的方法为静态的,而子类中的方法不是静态的,但是两个方法除了这一点外其他都满足覆盖条件,那么会发生编译错误。反之亦然。即使父类和子类中的方法都是静态的,并且满足覆盖条件,但是仍然不会发生覆盖,因为静态方法是在编译的时候把静态方法和类的引用类型进行匹配。

方法的覆盖和重载具有以下相同点:

都要求方法同名

都可以用于抽象方法和非抽象方法之间

方法的覆盖和重载具有以下不同点:

方法覆盖要求参数列表(参数签名)必须一致,而方法重载要求参数列表必须不一致。

方法覆盖要求返回类型必须一致,方法重载对此没有要求。

方法覆盖只能用于子类覆盖父类的方法,方法重载用于同一个类中的所有方法(包括从父类中继承而来的方法)

方法覆盖对方法的访问权限和抛出的异常有特殊的要求,而方法重载在这方面没有任何限制。

父类的一个方法只能被子类覆盖一次,而一个方法可以在所有的类中可以被重载多次。

另外,对于属性(成员变量)而言,是不能重载的,只能覆盖。

注:可以在覆盖的方法前面加上注解@Override,加上后当该方法不满足对父类方法的覆盖条件(三同一不低)时,编译会出现错误提示。

public classFieldDemo {public static voidmain(String[] args){

Student t= new Student("Jack");

Person p= t;//父类创建的引用指向子类所创建的对象

System.out.println(t.name+","+p.name);

System.out.println(t.getName()+","+p.getName());

}

}classPerson{

String name;intage;publicString getName(){return this.name;

}

}class Student extendsPerson{

String name;//属性和父类属性名相同,但在做开发时一般不会和父类属性名相同!!

publicStudent(String name){this.name =name;super.name = "Rose"; //为父类中的属性赋值

}publicString getName(){return this.name;

}

}

返回结果是:

Jack,RoseJack,Jack

原因是:在Java中,属性绑定到类型,方法绑定到对象!

public classCar {public voidTick()

{

Show();

}private voidShow()

{

System.out.println("fu show");

}

}public class MyCar extendsCar

{public int num = 8;public voidShow()

{

System.out.println("Zi show");

}

}public classDemo {/*** 主函数入口

*@paramargs*/

public static voidmain(String[] args) {//TODO Auto-generated method stub

MyCar c= newMyCar();

c.Tick();

}

}

override java field_JAVA方法的重载(overload)和覆盖(override)相关推荐

  1. java override overwrite,重写(overwrite)、重载(overload)和覆盖(override)

    覆盖(override):子类继承了父类的同名无参函数.当子类从父类继承了一个无参函数,而又定义了一个同样的无参函数,则子类定义的方法覆盖父类的方法,称为覆盖.废弃父方法 1.覆盖的方法的标志必须要和 ...

  2. C++多态及重载(overload),覆盖(override),隐藏(hide)的区别

    转自 Hackbuteer1 http://blog.csdn.net/hackbuteer1/article/details/7475622 C++编程语言是一款应用广泛,支持多种程序设计的计算机编 ...

  3. 【C++专题】重载(overload)、覆盖(override)、隐藏(hide) 辨析

    写正题之前,先给出几个关键字的中英文对照,重载(overload),覆盖(override),隐藏(hide).在早期的C++书籍中,可能翻译的人不熟悉专业用语(也不能怪他们,他们不是搞计算机编程的, ...

  4. Java中方法的重载(overload)与重写/覆写(override)

    重载-Overload 函数的方法参数个数或类型不一致,称为方法的重载. 从含义上说,只要求参数的个数或参数的类型不一致就说两个函数是重载函数,而至于返回值是否一样,没关系.同时,重载可以发生在同一个 ...

  5. 重载(overload)、覆盖(override)、隐藏(hide)的区别

    http://blog.csdn.net/yanjun_1982/archive/2005/09/02/470405.aspx 重载是指不同的函数使用相同的函数名,但是函数的参数个数或类型不同.调用的 ...

  6. 重载Overload 和重写Override区别

    重载Overload 和重写Override区别 一.含义 二.代码 1.重载OverLoad 2.重写Override 一.含义 重载OverLoad:表示同一个类中的可以有多个方法名称相同的方法, ...

  7. 解析java中方法的重载和重写之间的区别与联系

    解析java中方法的重载和重写之间的区别与联系 1 不同点 1.1 方法重写是在不同的类中(父子类),方法重载是在同一类中 1.2 方法重载最初的目的是构造方法的多样化,方法重写的目的是让重写的方法满 ...

  8. 关于java方法的重载(Overloading),覆写(Override)以及final 方法的几点说明

    昨天在一个群里面一个群友问道final 方法可不可以重载,我不假思索的说final 方法不能继承不能重载.后来晚上睡不着觉想想总觉得不对头,翻翻书一看自己简直就是胡说八道,才意识到这些基础概念的东西时 ...

  9. java中的几个术语(覆写override,隐藏hiding,重载overload,遮蔽shadowing,遮盖obscuring)

    今天看完<Java Puzzlers>的第八章,里面各种name reuse,章节最后做了一个非常细致的总结! Overriding(覆写) 一个实例方法可以override它的父类中可以 ...

  10. Java基础---方法的重载(overload)+ 优先向上匹配原则

    方法的重载(overload) 在一个类中,方法名相同,参数列表不同,方法的实现也不同的现象,称为方 法的重载. 特点:必须是在同一个类中,不同类的不构成重载:方法名相同,大小写等完全一样:参数列表不 ...

最新文章

  1. 2021年大数据常用语言Scala(六):基础语法学习 数据类型与操作符
  2. 避免让网站沦为摆设,从三个方面着手塑造!
  3. angular生命周期钩子ngOnChanges-父组件使子组件输入属性值变化时触发
  4. JZOJ 5906. 【NOIP2018模拟10.15】传送门 (portal)
  5. 使用 SAP HANA Virtual Table 连接外部数据源
  6. python处理csv文件列错位_CSV文件分割与列异常处理的python脚本
  7. mexw32与mexw64
  8. jquery深入学习
  9. div超出不换行_div+CSS设置一行内文字超过宽度不换行且不显示
  10. 工作闲了觉得无聊,忙了觉得累......
  11. (68)Vue-cli 目录与文件
  12. Go Web编程(Go语言性能好 语法简单 开发效率高 )
  13. 传奇gom引擎架设教程
  14. 解读《大话西游之大圣娶亲》
  15. Python网络爬取科目一题库(1685道)2021.1.3
  16. 《深入理解Android:Wi-Fi,NFC和GPS》章节连载[节选]--第九章 深入理解GPS
  17. bzoj4998 星球联盟
  18. 【JavaSE进阶(上)】自学笔记 记得收藏时时回顾
  19. github问题之Unable to retrieve your user info from the server
  20. 互联网券商证券公司网上开户系统设计

热门文章

  1. 阿里架构师的日志:带你快速理解微服务架构;理解微服务架构的核心
  2. bzoj千题计划254:bzoj2286: [Sdoi2011]消耗战
  3. 重写( override)and 重载(overload)
  4. mac osx 系统 brew install hadoop 安装指南
  5. Facebook团队关于网页缓存的再实践
  6. C++:怎样把一个int转成4个字节?
  7. Cocos2d 利用继承Draw方法制作可显示三维数据(宠物三维等)的三角形显示面板...
  8. 关于WPF的Binding 的 ConverterParameter 参数的动态设置
  9. 拓端tecdat|WinBUGS对多元随机波动率模型:贝叶斯估计与模型比较
  10. x.view(-1,4)