方法重载与重写
1177字约4分钟
2024-12-02
方法重载与重写
方法重载
在Java中,同一个类里面,有多个相同名字的方法存在,但要求形参列表不一样
比如:在System.out.println();
中 out
是 PrintStream
类型
println()
就是java.io.PrintStream
类里的一个方法,它的作用是向控制台输出信息。- 里面有很多重载的方法,这样就保证了任意的东西都可以输出。
重载的好处:
- 减轻了起名的麻烦
- 减轻了记名的麻烦
方法重载实例代码:
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)方法已被执行...");
}
方法重载使用细节
方法名必须相同
形参列表里面的内容不能一样(形参里的参数类型、参数个数以及参数类型的顺序,至少要有一个不一样,参数名没有要求,就是要么顺序不一样,要么参数类型不一样,要么个数不一样)
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; }
构造器也属于一种方法,所以构造器也可以使用方法重载,构造器的重载方法和普通方法的重载方法是一样的
注意点
public double overload(int a, double b) {
System.out.println("overload(int a, double b)方法已被执行...");
return a + b;
}
// 如果方法名以及形参列表里面的值都是一样的,只是单纯的修改返回类型
// 这样写的代码不能构成重载
/*
public void overload(int a, double b) {
System.out.println("overload(int a, double b)方法已被执行...");
double vi = a + b;
}
*/
方法重写
方法重写也就方法覆盖,就是子类的一个方法1,和父类的方法2,它们的方法名称、返回类型和参数是一样的(修饰符可以不一样),那么方法1就实现对方法2的重写(或则说是覆盖)
public class A1 {
protected void info() {
System.out.println("A1");
}
}
public class A3 extends A1 {
// 该方法的返回类型,方法名称以及参数和父类中的方法是一致的,所以构成方法重写
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
)
细节1
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;
}
}
细节2
返回类型可以是自己定义的某个类
public class Demo01 {
public AAA n1() {
return null;
}
}
public class Demo02 extends Demo01 {
public BBB n1() {
return null;
}
}
class AAA {
}
class BBB extends AAA {
}