一、java中的重载与重写的区别:
重写发生在父子类中,方法名相同,参数列表相同,方法体不同,遵循“运行期”绑定,重写方法被调用时,看对象的类型
重载发生在同一个类中,方法名称相同,参数列表不同,方法体不同,遵循“编译期”绑定,看引用的类型
二、重载
重载发生在本类,方法名相同,参数列表不同,与返回值无关,只和方法名,参数列表,参数的类型有关.
重载(Overload):首先是位于一个类之中或者其子类中,具有相同的方法名,但是方法的参数不同,返回值类型可以相同也可以不同。
(1):方法名必须相同
(2):方法的参数列表一定不一样。
(3):访问修饰符和返回值类型可以相同也可以不同。
其实简单而言:重载就是对于不同的情况写不同的方法。 比如,同一个类中,写不同的构造函数用于初始化不同的参数。
public class Calculator {
public int add(int a, int b) {
return a + b;
}
public double add(double a, double b) {
return a + b;
}
public int add(int a, int b, int c) {
return a + b + c;
}
}
public class Main {
public static void main(String[] args) {
Calculator calculator = new Calculator();
System.out.println(calculator.add(2, 3)); // 调用第一个add方法,输出5
System.out.println(calculator.add(2.5, 3.7)); // 调用第二个add方法,输出6.2
System.out.println(calculator.add(2, 3, 4)); // 调用第三个add方法,输出9
}
}
三、重写
(1):相同的方法名称,相同的参数列表,相同的返回值类型
(2):访问权限不能变小,可以变大,意思是子类方法所具有的访问修饰符必须跟父类的方法的访问修饰符相同或者更宽的访问修饰符
(3):不能抛出更大的异常,重写方法时不能改变方法的static或非static性质;
看个例子
public class Phone{
public void call(){
System.out.println("打电话");
}
public void sendMessage(){
System.out.println("发短信");
}
}
public class Iphone extends Phone{
public void call(){
System.out.println("显示图像");
System.out.println("显示归属地");
System.out.println("打电话");
}
}
public class Demo{
public static void main (String[] args){
Phone p =new Phone();
p.call();
p.sendMessage();
System.out.println("-----------");
Iphone ip = new Iphone();
ip.call();
ip.sendMessage();
}
}
结果为
打电话
发短信
-----------
显示图像
显示归属地
打电话
发短信