Java中方法重载与方法重写的区别

二者名字相似,但用处大不相同

方法重载

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",子类对父类实现了重写

总结重写的特征:

  1. 方法名必须相同
  2. 参数列表必须相同
  3. 修饰符范围可以扩大但不能缩小(public>Protected>Default>private)
  4. 抛出异常的范围可以被缩小,但不能扩大

不能被重写的方法有:static 静态方法, private 私有方法, final 常量

发布了5 篇原创文章 · 获赞 1 · 访问量 364

猜你喜欢

转载自blog.csdn.net/cun_king/article/details/105177143