方法重载与重写
1119字约4分钟
2025-09-23
方法重载
在Java中,同一个类里面,有多个相同名字的方法存在,但要求形参列表不一样
比如:System.out.println();
中 out
是 PrintStream
类型
println()
就是java.io.PrintStream
类里的一个方法,它的作用是向控制台输出信息。- 里面有很多重载的方法,这样就保证了任意的东西都可以输出。
重载的好处:
- 减轻了起名的麻烦
- 减轻了记名的麻烦
class OverloadExercise {
public int overload(int a, int b) {
System.out.println("overload(int a, int b)方法已被执行...");
return a + b;
}
public double overload(int a, double b) {
System.out.println("overload(int a, double b)方法已被执行...");
return a + b;
}
public double oversion(double a, int b) {
System.out.println("overload(double a, int b)方法已被执行...");
return a + b;
}
public double oversion(int a, int b, double c) {
System.out.println("overload(int a, int b, double c)方法已被执行...");
return a + b + c;
}
}
public class Overload01 {
public static void main(String[] args) {
// 方法重载
OverloadExercise oe = new OverloadExercise();
System.out.println(oe.overload(1, 1)); // 2
}
}
方法重载使用细节
方法名必须相同
形参列表里面的内容不能一样
形参里的参数类型、参数个数以及参数类型的顺序,至少要有一个不一样,参数名没有要求
public int overload(int a, int b) { System.out.println("overload(int a, int b)方法已被执行..."); return a + b; } // 虽然参数名的顺序交换了,但是参数类型是一样的,所以不能实现方法重载 /* public int overload(int b, int a) { System.out.println("overload(int b, int a)方法已被执行..."); return a + b; } */
返回的数据类型可以不一样,但是要注意
return
的返回值不能大于自己定义的返回数据类型public float overload(float a, int b) { System.out.println("overload(int a, int b)方法已被执行..."); return a + b; } public double overload(int b ,float a) { System.out.println("overload(int a, int b)方法已被执行..."); return a + b; }
构造器也属于一种方法,所以构造器也可以使用方法重载,构造器的重载方法和普通方法的重载方法是一样的
方法重写
方法重写也就方法覆盖,就是子类的一个方法1,和父类的方法2,它们的方法名称、返回类型和参数是一样的(修饰符可以不一样),那么方法1就实现对方法2的重写(或则说是覆盖)
public class A1 {
protected void info() {
System.out.println("A1");
}
}
public class A3 extends A1 {
// 该方法的返回类型,方法名称以及参数和父类中的方法是一致的,所以构成方法重写
@Override
public void info() {
System.out.println("A3");
}
}
public class Demo01 {
public static void main(String[] args) {
A3 a3 = new A3();
a3.info(); // 输出 A3
}
}
方法重写的注意事项
- 子类中方法的方法名称和参数(形参列表)要和父类中的方法一致
- 返回类型要么和父类一样;要么该返回 父类 返回类型的子类
- 在重写中,子类方法不能缩小父类方法的访问权限(访问权限优先级:
public
>protected
>默认
>private
)
public class Demo01 {
public Object n1() {
return null;
}
}
public class Demo02 extends Demo01 {
// 返回类型可以是一个类(String,Double, Integer之类的)
// 也可以是一个类型(int,double之类的)
// 在重写中,这个返回类型要么和父类一样
// 要么这个返回类型是 父类方法中 返回类型的子类
// 父类中返回类型是Object,子类中返回类型是Integer
// 而Integer是Object的子类,所以构成重写
// 注意:子类的返回类型不能大于父类的返回类型
// 比如子类的返回类型是Object
// 而父类的返回类型是Integer
// 因为Integer是Object的子类,这样不满足重写的规则
public Integer n1() {
return null;
}
}
返回类型可以自己自定义
public class Demo01 {
public AAA n1() {
return null;
}
}
public class Demo02 extends Demo01 {
// 重写方法的时候,父类中的方法的返回类型如果是创建好的
// 那么子类中方法的返回类型也要和父类中的返回类型必须是继承或者同级关系
public BBB n1() {
return null;
}
}
class AAA {
}
class BBB extends AAA {
}