Java方法重载和Java方法重写
admin
2024-03-26 12:20:48
0

Java方法重载

Java 允许同一个类中定义多个同名方法,只要它们的形参列表不同即可。如果同一个类中包含了两个或两个以上方法名相同的方法,但形参列表不同,这种情况被称为方法重载(overload)。

例如,在 JDK 的 java.io.PrintStream 中定义了十多个同名的 println() 方法。

public void println(int i){…}
public void println(double d){…}
public void println(String s){…}

这些方法完成的功能类似,都是格式化输出。根据参数的不同来区分它们,以进行不同的格式化处理和输出。它们之间就构成了方法的重载。实际调用时,根据实参的类型来决定调用哪一个方法。例如:

System.out.println(102);    // 调用println(int i)方法
System.out.println(102.25);    // 调用println(double d)方法
System.out.println("价格为 102.25");    // 调用println(String s)方法

方法重载的要求是两同一不同:同一个类中方法名相同,参数列表不同。至于方法的其他部分,如方法返回值类型、修饰符等,与方法重载没有任何关系。

使用方法重载其实就是避免出现繁多的方法名,有些方法的功能是相似的,如果重新建立一个方法,重新取个方法名称,会降低程序可读性。

例 1

在比较数值时,数值的个数和类型是不固定的,可能是两个 int 类型的数值,也可能是两个 double 类型的数值,或者是两个 double、一个 int 类型的数值;在这种情况下就可以使用方法的重载来实现数值之间的比较功能。

具体实现代码如下:

public class OverLoading {public void max(int a, int b) {// 含有两个int类型参数的方法System.out.println(a > b ? a : b);}public void max(double a, double b) {// 含有两个double类型参数的方法System.out.println(a > b ? a : b);}public void max(double a, double b, int c) {// 含有两个double类型参数和一个int类型参数的方法double max = (double) (a > b ? a : b);System.out.println(c > max ? c : max);}public static void main(String[] args) {OverLoading ol = new OverLoading();System.out.println("1 与 5 比较,较大的是:");ol.max(1, 5);System.out.println("5.205 与 5.8 比较,较大的是:");ol.max(5.205, 5.8);System.out.println("2.15、0.05、58 中,较大的是:");ol.max(2.15, 0.05, 58);}
}

编译、运行上面程序完全正常,虽然 3 个 max() 方法的方法名相同,但因为它们的形参列表不同,所以系统可以正常区分出这 3 个方法。当运行时,Java 虚拟机会根据传递过来的不同参数来调用不同的方法。

运行结果如下:

1 与 5 比较,较大的是:
5
5.205 与 5.8 比较,较大的是:
5.8
2.15、0.05、58 中,较大的是:
58.0

为什么方法重载不能用方法的返回值类型区分呢?

对于int f( ) { }void( ) { }两个方法,如果这样调用int result = f();,系统可以识别是调用返回值类型为 int 的方法,但 Java 调用方法时可以忽略方法返回值,如果采用如下方法来调用f();,你能判断是调用哪个方法吗?如果你尚且不能判断,那么 Java 系统也会糊涂。

在编程过程中有一条重要规则就是不要让系统糊涂,系统一糊涂,肯定就是你错了。

因此,Java 里不能用方法返回值类型作为区分方法重载的依据。

Java方法重写

在子类中如果创建了一个与父类中相同名称、相同返回值类型、相同参数列表的方法,只是方法体中的实现不同,以实现不同于父类的功能,这种方式被称为方法重写(override),又称为方法覆盖。

当父类中的方法无法满足子类需求或子类具有特有功能的时候,需要方法重写。

子类可以根据需要,定义特定于自己的行为。既沿袭了父类的功能名称,又根据子类的需要重新实现父类方法,从而进行扩展增强。

在重写方法时,需要遵循下面的规则:

  • 参数列表必须完全与被重写的方法参数列表相同。
  • 返回的类型必须与被重写的方法的返回类型相同(Java1.5 版本之前返回值类型必须一样,之后的 Java 版本放宽了限制,返回值类型必须小于或者等于父类方法的返回值类型)。
  • 访问权限不能比父类中被重写方法的访问权限更低(public>protected>default>private)。
  • 重写方法一定不能抛出新的检査异常或者比被重写方法声明更加宽泛的检査型异常。例如,父类的一个方法声明了一个检査异常 IOException,在重写这个方法时就不能抛出 Exception,只能拋出 IOException 的子类异常,可以抛出非检査异常。

另外还要注意以下几条:

  • 重写的方法可以使用 @Override 注解来标识。
  • 父类的成员方法只能被它的子类重写。
  • 声明为 final 的方法不能被重写。
  • 声明为 static 的方法不能被重写,但是能够再次声明。
  • 构造方法不能被重写。
  • 子类和父类在同一个包中时,子类可以重写父类的所有方法,除了声明为 private 和 final 的方法。
  • 子类和父类不在同一个包中时,子类只能重写父类的声明为 public 和 protected 的非 final 方法。
  • 如果不能继承一个方法,则不能重写这个方法。

例 1

每种动物都有名字和年龄属性,但是喜欢吃的食物是不同的,比如狗喜欢吃骨头、猫喜欢吃鱼等,因此每种动物的介绍方式是不一样的。

下面编写 Java 程序,在父类 Animal 中定义 getInfo() 方法,并在子类 Cat 中重写该方法, 实现猫的介绍方式。

父类 Animal 的代码如下:

public class Animal {public String name; // 名字public int age; // 年龄public Animal(String name, int age) {this.name = name;this.age = age;}public String getInfo() {return "我叫" + name + ",今年" + age + "岁了。";}
}

子类 Cat 的代码如下:

public class Cat extends Animal {private String hobby;public Cat(String name, int age, String hobby) {super(name, age);this.hobby = hobby;}public String getInfo() {return "喵!大家好!我叫" + this.name + ",我今年" + this.age + "岁了,我爱吃" + hobby + "。";}public static void main(String[] args) {Animal animal = new Cat("小白", 2, "鱼");System.out.println(animal.getInfo());}
}

如上述代码,在 Animal 类中定义了一个返回值类型为 String、名称为 getInfo() 的方法,而 Cat 类继承自该类,因此 Cat 类同样含有与 Animal 类中相同的 getInfo() 方法。

但是我们在 Cat 类中又重新定义了一个 getInfo() 方法,即重写了父类中的 getInfo() 方法。

在 main() 方法中,创建了 Cat 类的对象 animal,并调用了 getInfo() 方法。输出的结果如下:

喵!大家好!我叫小白,我今年2岁了,我爱吃鱼。

如果子类中创建了一个成员变量,而该变量的类型和名称都与父类中的同名成员变量相同,我们则称作变量隐藏。

Java入门基础视频教程,java零基础自学就选黑马程序员Java入门教程(含Java项目和Java真题)

相关内容

热门资讯

女朋友快生日了我不在她身边想说... 女朋友快生日了我不在她身边想说几句浪漫点得祝福语,请各位帮忙...亲爱的,距离永远阻挡不了我对你爱,...
我18岁了,想献血,请问献血有... 我18岁了,想献血,请问献血有什么规定?无传染性疾病
即便心再痛,也愿意因为爱而停下... 即便心再痛,也愿意因为爱而停下来等待前任回头的星座有哪些?摩羯座,金牛座还有白羊座就这个星座他是非常...
第一个字是从的成语大全,从字开... 第一个字是从的成语大全,从字开头的四字词语 第一个字是从的成语大全 从容应对、 从容自若、 从天...
谁能给我紫藤萝瀑布课后练习第1... 谁能给我紫藤萝瀑布课后练习第1题的答案!自己写。原先,焦虑和悲痛“一直压在我心上”,在繁花盛开的藤萝...
冷笑话的定义是什么? 冷笑话的定义是什么?怎么样的话才算冷笑话?不好笑的笑话吧.定义1:就是讲的人挺平静的,基本上面无表情...
感觉自己失去了目标,现在不知道... 感觉自己失去了目标,现在不知道该怎么生存下去了。人生中没有一帆风顺,现成的路可走,总会遇到一些困难,...
我都24了,还没有男朋友,我真... 我都24了,还没有男朋友,我真的很慌。怎么办?身边也没有男生说喜欢我你愿意网恋吗缘分 不要宅在家里那...
我有一个朋友,我们总是出去玩,... 我有一个朋友,我们总是出去玩,喝酒。但是他每次出来都要炫耀他赚了多少钱,我觉得他很爱炫,我就不想和炫...
林永健拍过什么电视剧 林永健拍过什么电视剧金婚喜耕田的故事城里城外马文的战争
斑马s6有必要学吗 斑马s6有必要学吗有。1、激发兴趣:通过有趣的故事、游戏和其他互动活动,斑马儿童英语S6可以激发孩子...
甜蜜乐章 撮合不了子奇和慕容啊... 甜蜜乐章 撮合不了子奇和慕容啊~~~~!必须是金曲奖的最佳演唱人,不然触发不了
暮光之城3 暮光之城3现在没有出呢!有也是骗人的!起码要国内上映之后吧!我和你一样期待呢!
学生会查寝收走了东西,要用什么... 学生会查寝收走了东西,要用什么法律武器把收走的东西要回来?和学校讲法律,劝你还是别这么冲动了。拿到明...
信任无价主要讲了一个什么故事 信任无价主要讲了一个什么故事主要讲了:一位女老师通过绝食的办法,让那位偷了快译通的学生自己主动交出。
什么叫奴隶社会 什么叫奴隶社会 奴隶社会:从公元前21世纪夏朝建立开始,到公元前221年秦王嬴政统一中国结束。[1...
中级经济师人力资源专业怎么才能... 中级经济师人力资源专业怎么才能考过啊?只是看指定的那两本书《经济基础》和《人力资源管理》,然后再把上...
为什么海里都是水啊 为什么海里都是水啊海里没水 海就不叫海了不难怎么叫海水 嘿嘿。海里没水 海就不叫海了
14岁两个女生,一米深的河里手... 14岁两个女生,一米深的河里手绑手溺亡,疑点重重,怎么回事?这个是因为她们忍受不了家里面的重男轻女,...
帮解几道五年级数学题!急急急~... 帮解几道五年级数学题!急急急~快快快!(要解)52=2*2*13