java中重载和重写的区别
Posted 香风智乃哈~
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java中重载和重写的区别相关的知识,希望对你有一定的参考价值。
我已经遇到这两个东西很多遍了,每次遇到都是一知半解,说不出个所以然。这次又遇到了,就想把自己关于这两个东西的理解给梳理一下。也可以对以后的我有帮助(主要是怕自己又忘了(#.#))
那么开始吧。。(这两个东西都是对方法起作用的)
其实,关于两个东西的区别,有一个决定性的判断,重载必须发生在一个类中,而重写是发生在父类子类中(也就是有继承关系的类中)。
这个是决定性的。
其次,重载的方法名必须相同,参数列表不同(也可以说就是依据参数列表进行重载的)。
参数列表的不同包括:参数的个数不同、参数的类型不同、参数的顺序不同
public class OverLoad {
// 数据类型不同的重载
public void test(int a) {}
public void test(String a) {}
// 参数个数不同的重载
public void t2(int a,int b) {}
public void t2(int a) {}
// 参数顺序不同的重载
public void t3(int a ,String b) {}
public void t3(String b,int a) {}
// 注意参数顺序不同的重载不能写成同类型的
public void t4(int a,int b) {} //像这个两个参数都是int类型,交换参数没有意义,也就不是重载了。
}
还要注意一些重载的特殊情况
//猜一下这个代码输出的是哪个语句?
public class OverLoad2 {
public void test(int a) {
System.out.println("我是int里面的");
}
public void test(short a) {
System.out.println("我是short里面的");
}
public static void main(String[] args) {
OverLoad2 o = new OverLoad2();
o.test(10);
}
}
没错,下面这个就是输出结果
原因:
java中也是遵守就近原则的,离哪个类型近一点就执行哪一个,传入的是10,默认是int类型,所以说,执行的是这个。
当然,有一个参数的特殊情况就会有两个参数的特殊情况
//猜一下这个的执行结果~~
public class OverLoad2 {
public void test(int a,long b) {}
public void test(long a,int b) {}
public static void main(String[] args) {
OverLoad2 o = new OverLoad2();
o.test(10, 10);
}
}
答案是会报错,,,因为这个就是像有选择困难症的人一样,jvm看到第一个参数是10,int找到了第一个方法,第二个也是10,就找到了第二个方法,最后就不知道执行哪个方法了。
这个的修改可以把o.test(10L,10)改为这样,当然也可以把参数列表给修改一下比如把第一个方法改为test(int a,int b),第二个也是同理。
接下来是重写的方法名和参数列表
(在发生在父类和子类的前提下)重写的方法名和参数列表必须是相同的,就像我们经常重写Object类里面的toString()方法。
class Person{
public void test() {
System.out.println("我是父类里面的测试方法");
}
}
class Student extends Person{
public void test() {
System.out.println("我是子类中的测试方法");
}
}
public class Override {
public static void main(String[] args) {
Student s = new Student();
s.test();
}
}
像这个Student和Person就是用的方法的重写,重写也就是在子类中重新书写该方法。也就是父类的代码不能满足当前子类的需求时使用。
重载的修饰符、返回类型和抛出异常等
重载对这些东西没有特别的要求,也就是说这些东西可以相同,也可以不相同,但是,它们大多数情况下都是相同的。
重写的修饰符、返回类型和抛出异常
重写的修饰符可以将子类的修饰符不变或者扩大但是不能缩小
class Person{
protected void test() {
System.out.println("我是父类里面的测试方法");
}
}
class Student extends Person{
public void test() {
System.out.println("我是子类中的测试方法");
}
}
public class Override {
public static void main(String[] args) {
Student s = new Student();
s.test();
}
}
比如这个父类方法修饰符为protected,那子类就能和他相同或者扩大,但权限不能比父类的小,
修饰符的种类(修饰权限从高到低)
public -----protected-----default-----private
重写的返回类型和抛出异常都不能比父类的大(可以是相等也可以是子类型)
重写返回类型,子类可以返回的类型和父类的相同,也可以是子类型,也就是说,子类的返回类型可以是父类的子类型。
但是,也要注意一些特殊情况
//这个代码会执行报错的,因为short并不是int的子类型。
class Animal{
public int test() {
return 0;
}
}
class Dog extends Animal{
public short test() {
return 0;
}
}
public class Override3 {
public static void main(String[] args) {
Animal a = new Dog();
a.test();
}
}
重写的抛出异常也是同理,子类抛出的异常不能比父类抛出的异常大。也就是说,不能扩大异常的作用范围。
以上就是java中重载和重写的区别啦。
以上是关于java中重载和重写的区别的主要内容,如果未能解决你的问题,请参考以下文章