java中函数重载与函数重写的区别
在Java中,有两个常见的函数概念,函数重载和函数重写。虽然这两者非常相似,但它们具有很大的区别,本文将解释这两个概念的区别。
函数重载
Java中的函数重载是指在同一个类中定义具有相同名称但不同参数的多个函数。Java的这种函数重载是一种编译时多态,也称为静态多态。函数重载使得我们可以使用相同的方法名执行不同类型的操作,使代码更简洁高效。
在函数重载之前,我们需要考虑以下的一些规则:
1. 函数名必须相同(但参数的名称和数量可以不同)
2. 参数类型必须不同
3. 函数的返回类型可以相同,也可以不同
4. 方法重载可以是public,private或protected
5. 重载函数只能通过参数类型来区分,而不能通过返回类型来区分
6. 当调用方法时,编译器会根据传递的参数类型和数量来决定调用哪个方法,如果参数传递的类型和定义的不匹配,则会报错
函数重载实例:
class OverloadDemo {
public void add(int a, int b) {
System.out.println("Sum = " + (a + b));
}
public void add(double a, double b) {
System.out.println("Sum = " + (a + b));
}
public void add(int a, int b, int c) {
System.out.println("Sum = " + (a + b + c));
}
public static void main(String[] args) {
OverloadDemo demo = new OverloadDemo();
demo.add(3, 4);
demo.add(4.5, 6.7);
demo.add(2, 3, 4);
}
}
函数重写
Java中的函数重写是指在子类中重新定义父类中的某个具有相同名称和参数列表的方法。Java的这种函数重写是一种运行时多态,也称为动态多态。在函数重写中,子类必须提供与父类中相同的函数签名,才能被重写。
在函数重写之前,我们需要考虑以下的一些规则:
1. 重写函数的名称、参数列表和返回类型必须与父类中的相同
2. 重写的函数不能比父类中的函数具有更严格的访问控制权限,子类中的访问控制权限必须与父类中的相同或更宽松
3. 不能重写被声明为private或final的方法
4. 对于静态和非静态方法,不能出现方法名、参数类型、返回类型相同的情况,因为静态是属于类的,而不是方法的。
函数重写实例:
class Shape {
public void draw() {
System.out.println("I am a shape.");
}
}
class Circle extends Shape {
public void draw() {
System.out.println("I am a circle.");
}
}
class Square extends Shape {
public void draw() {
System.out.println("I am a square.");
}
}
public class OverrideDemo {
public static void main(String[] args) {
Shape s1 = new Circle();
Shape s2 = new Square();
s1.draw();
s2.draw();
}
}
输出结果为:
I am a circle. I am a square.
结论
函数重载和函数重写两个概念都是为实现多态而设计的,但它们的实现方式不同。函数重载只在编译时进行解析,以根据参数列表中传递的值来选择正确的方法,而函数重写是在运行时进行解析的,由实际对象的类型来决定调用哪个方法。
