二者名字相似,但用处大不相同
方法重载
java在同一个类中可以定义多个重名的方法,用于不同的用途。这些同名的不同方法之间的区别在于参数列表的不同。这就是方法重载。
比如写一个比大小的程序
//比大小
public static int numMax(int a1, int a2){
if(a1 > a2) {
return a1;
} else {
return a2;
}
}
//比大小
public static double numMax(double a1, double a2){
if(a1 > a2) {
return a1;
} else {
return a2;
}
}
复制代码
可以看到,两个方法名字都叫做numMax,但是返回值不同,一个是int型,另一个是double型,另外就是比较的参数类型也是不同的。
如果在main方法中进行如下比较:
public static void main(String[] args){
int num1 = 1;
int num2 = 2;
System.out.println(numMax(num1, num2));
}
//2
复制代码
声明的两个变量都是int型,返回的值也是int型。
如果把值换成double型
public static void main(String[] args){
double num1 = 1.0;
double num2 = 2.0;
System.out.println(numMax(num1, num2));
}
//2.0
复制代码
那么返回的值也变成了double型。
也就是在本示例中,参数类型如果是int型,那么就会调用第一个方法;参数类型如果是double型,就会调用第二个方法。这是Java虚拟机自行判断的
重载的规则如下:
方法名称必须相同
参数列表必须不同(个数不同、类型不同、参数排列顺序不同等)
方法的返回类型可以相同,也可以不同
仅仅返回类型不同不足以构成方法的重载
针对第四条,如果我们仅仅修改返回类型,就会报出一条错误(已经被定义)
方法重写
重写是不同类之间的操作,且要求它们之间有继承的关系。子类重写父类的方法。
当子类不需要或者不满足父类的功能时就应用到了重写
现在定义三个类,类1名为Application,用来存放我们的主方法;类2名为B;类3名为A,且继承B类。
给出B的程序:
public class B{
public void test(){
System.out.println("B==>test");
}
}
复制代码
如果我们想要重写B类中的test方法,可以使用快捷键alt+Insert,弹出窗口如下,可以看到重写方法命令
点击后会获得如下程序:
public class A extends B{
@Override
public void test(){
super.test();
}
}
复制代码
其中@Override是一个注解,表示重写。可以看到,系统默认调用父类的方法,我们可以对它做出修改。
public class A extends B{
@Override
public void test(){
//super.test();
System.out.println("A==>test");
}
}
复制代码
主方法中程序如下:
public class Application{
public static void main(String[] args){
A a = new A();
a.test();
B b = new B();
b.test();
}
}
//A==>test
//B==>test
复制代码
调用同样的方法,可以看到父类输出"B==>test",子类输出"A==>test",子类对父类实现了重写
总结重写的特征:
方法名必须相同
参数列表必须相同
修饰符范围可以扩大但不能缩小(public>Protected>Default>private)
抛出异常的范围可以被缩小,但不能扩大
不能被重写的方法有:static 静态方法, private 私有方法,final 常量