重载(Overload)和重写(Override)的区别
1,重载(Overloading)
(1) 方法重载是让类以统一的方式处理不同类型数据的一种手段。多个同名函数同时存在,具有不同的参数个数/类型。
重载Overloading是一个类中多态性的一种表现。
(2) Java的方法重载,就是在类中可以创建多个方法,它们具有相同的名字,但具有不同的参数和不同的定义。
调用方法时通过传递给它们的不同参数个数和参数类型来决定具体使用哪个方法, 这就是多态性。
(3) 重载的时候,方法名要一样,但是参数类型和个数不一样,返回值类型可以相同也可以不相同。但是返回值不能作为重载的判定条件。(无法以返回型别作为重载函数的区分标准)
下面是重载的例子:
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | package com.demo.sw.test; public class OverLoadClass { public void OverLoadMethod(){ } public void OverLoadMethod(String s){ } public void OverLoadMethod( int n, String s){ } public String OverLoadMethod(String s, int n){ return null ; } } |
2,重写(Overriding)
(1) 父类与子类之间的多态性,对父类的函数进行重新定义。
如果在子类中定义某方法与其父类有相同的名称和参数,我们说该方法被重写 (Overriding)。
在Java中,子类可继承父类中的方法,而不需要重新编写相同的方法。但有时子类并不想原封不动地继承父类的方法,而是想作一定的修改,这就需要采用方法的重写。
(2) 若子类中的方法与父类中的某一方法具有相同的方法名、返回类型和参数表,则新方法将重写原有的方法。如需父类中原有的方法,可使用super关键字,该关键字引用了当前类的父类。
(3) 子类函数的访问修饰权限不能少于父类的;
下面是重写的例子:
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | package com.demo.sw.test; public class Parent { public void say(){ System.out.println( "I am the Parent." ); } public String sayHello(){ return "Hello, I am a man." ; } public String sayHello(String name){ return "Hello " + name + " ." ; } public void say( int n){ System.out.println( "what you input in the method is :" + n); } /* public void say(byte b){ System.out.println("what you input in the method is :" + b); } */ private static final String sayH(){ // 这里的 private 不能改成 public 类型的,因为子类不能重载这样的方法 return "hhh" ; } } |
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | package com.demo.sw.test; public class Child extends Parent { public void say( int n){ n++; System.out.println( "After Override The Result is :" + n); } /* public void say(byte b){ b++; System.out.println("After Override The Result is :" + b); } */ public void say(){ System.out.println( "I am the Child Override My Parent's Method." ); } public String sayHello(){ return "Hello, I am a boy." ; } public String sayHello(String name){ return "Hello, " + name + " ." ; } public static final String sayH(){ return "this is the static final method." ; } public static final String sayH(String name){ return "this is the static final method and you input is :" + name; } } |
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | package com.demo.sw.test; public class TestOverride { public static void main(String[] args) { Parent p = new Parent(); //p.say(); Parent pc = new Child(); pc.say(); pc.say( 1 ); pc.say(( byte ) 1 ); Child chld = new Child(); //chld.say(); System.out.println(chld.sayH()); System.out.println(Child.sayH()); System.out.println(Child.sayH( "fff" )); } } |
概念:即调用对象方法的机制。
动态绑定的内幕:
1、编译器检查对象声明的类型和方法名,从而获取所有候选方法。试着把上例 Parent 类的 say 注释掉,这时再编译就无法通过。
2、重载决策:编译器检查方法调用的参数类型,从上述候选方法选出唯一的那一个(其间会有隐含类型转化)。如果编译器找到多于一个或者没找到,此时编译器就会报错。
试着把上例 Parent 类的 say(byte b) 注释掉,这时运行结果是 2 2.
3、若方法类型为 priavte static final ,java 采用静态编译,编译器会准确知道该调用哪个方法。
4、当程序运行并且使用动态绑定来调用一个方法时,那么虚拟机必须调用对象的实际类型相匹配的方法版本。
在例子中,pc 所指向的实际类型是 Child,所以 pc.say(1) 调用子类的 say(int n) 。但是,子类并没有重写say(byte b),所以 pc.say((byte)1)调用的是父类的say(byte b)。
如果把父类的 say(byte b) 注释掉,则通过第二步隐含类型转化为 int, 最终调用的是子类的say(int i)。
总结:重载 和 重写
方法的重写 Overriding 和 重载 Overloading 是Java多态性的不同表现。
重写 Overriding 是父类与子类之间多态性的一种表现,重载 Overloading 是一个类中多态性的一种表现。
如果在子类中定义某方法与其父类有相同的名称和参数,我们说该方法被重写 (Overriding)。子类的对象使用这个方法时,将调用子类中的定义,
对它而言,父类中的定义如同被“屏蔽”了,而且如果子类的方法名和参数类型和个数都和父类相同,那么子类的返回值类型必须和父类的相同;
如果在一个类中定义了多个同名的方法,它们或有不同的参数个数或有不同的参数类型,则称为方法的重载(Overloading)。
Overloaded 的方法是可以改变返回值的类型。也就是说,重载的返回值类型可以相同也可以不同。
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步