二者名字相似,但用处大不相同
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",子类对父类实现了重写
总结重写
的特征:
不能被重写
的方法有:static 静态方法, private 私有方法, final 常量