首先说二者的相同点:
方法名相同
重写时,方法具有完全相同的参数
重载时,方法具有不同的参数(个数,类型或者顺序)
下面这个方法为原方法
public int getAge(int a){
return 1;
}
1 不同的参数个数
public int getAge(int a,int b){
return 1;
}
2 不同的参数类型
public int getAge(String a){
return 1;
}
3 不同的参数顺序
public int getAge(String a,int b){
return 1;
}
public int getAge(int a,String b){
return 1;
}
这两个方法就互为重载方法
我们知道方法除了参数还有返回类型,那么如果两个方法参数相同,方法名相同但是只有返回类型不同可以算是重载方法吗?
不能!
会提示错误你已经定义过这个方法,反过头来你想想,如果可以这么定义的话,那么这个对象应该调用哪个方法是不是就懵逼了?对象发现方法名和参数完全一样,根本区分不出来这个方法(期待着有一天虚拟机可以根据返回类型调用方法)
延伸
我们都知道面向对象三大特性之一就是多态,java基础经常会有下面这样的题目
public class Person {
public void getAge(){
System.out.println("我是人类");
}
}
public class Student extends Person {
public void getAge(){
System.out.println("我是个学生");
}
}
public class Main {
public static void main(String[] args) {
Person p = new Student();
p.getAge();
}
}
请问输出的是什么?
后来我们知道,对同一种信号的不同处理叫做“多态”,我们也知道了会输出“我是个学生”
我们打开Student类,准备重写它的getAge方法却发现找不到了,这也就意味着虽然·我们没有使用@Override注解告诉编译器这是子类重写的方法但是编译器自己存在检测功能,发现和父类一样的方法就默认重写这个方法
所以多态是特性,具体来说还是重写这个方法
我们知道重载是不能有同样的参数,而不是不同的返回类型,刚才我们一个类中已经测试了,现在Stdent和Person是两个类,在他们在两个类中,是不是就可以实现下面的效果呢?
public class Person {
public void getAge(){
System.out.println("我是人类");
}
}
public class Student extends Person {
public String getAge(){
System.out.println("我是个学生");
return "";
}
}
对不起,还是不可以
这个参数被父类使用了,子类不能再修改这个方法了,所以继承的好处也出来了
保护原有的结构同时可以让继承类扩展更多的功能。