7.Java方法重载,方法重写与this关键字,super关键字

1.方法重载

1.1. 什么是方法重载?

在Java程序中,当一个类的定义中,两个方法具有相同的名称,我们就称这两个方法重载了。

public class Person {
    int add(int x,int y){
        return x+y;
    }
    int add(int x){
        System.out.println("我会加法");
        return x+1;
    }
}

如上所示,在Person类中,有两个名为add的方法, 这两个方法就重载了。

1.2. 为什么会出现这样的情况?

在java中我们允许多个方法有相同的名字,是因为:
为了增强我们项目代码的稳定性,我们可能对一种业务有多种不同入参的组合,当我们需要对这一种情况进行应对,这时方法重载起到了作用,方法重载让我们在不改变业务含义的情况下进行不同的处理。
注意:重载方法的参数必须不同(就像我们人一样,名字可以相同,但长相一定不同),参数不同是指:参数的个数不同,参数的个数相同的情况下,这些参数至少有一个的参数类型不同。

注意:方法的返回类型和参数的名字不参与比较。(不影响重载)

2.方法重写

2.1.什么是方法重写

在Java程序中,有两个类Person,Student,其中Student是Person的子类,如果这两个类有一个相同的方法,我们就认为Student重写了Person的这个方法。 这就是方法重写。(也称方法覆盖)
例子:

public class Person {
    int add(int x,int y){
        return x+y;
    }
}

class Student extends Person{
    /**
     * 子类Student重写父类Person的方法:
     * int add(int x,int y)
     * @param x
     * @param y
     * @return
     */
    int add(int x,int y){
        return x+y+y;
    }
}

2.2.为什么会出现这样的情况?

在编写代码的过程种,如果一个子类继承了父类的方法后,父类的方法不能应对子类的所有需求,子类也可以对这个方法进行重写,使之满足自己的业务需求。

3.重载和重写的差别

类型位置不同作用不同
重载同一个类中在一个类中提供一种业务处理的多种实现实现多态
重写父子类之间子类可以选择覆盖父类的同一个方法的实现来达到自己的目的

4.this关键字

我们知道类中有局部变量和成员变量两个类型的变量,如果在一个类的一个方法中有着一个和方法外完全相同的变量。

比如:

public class A{
  int x = 10;
  void f(){
    int x = 5;
    x = x+5;
    System.out.println(x);
  }
}
我们知道它输出的是10(局部优先),但我们是不是就不能在f方法中用外面的x?
当然不是,this在这里的作用就出来了
public class A{
  int x = 10;
  void f(){
    int x = 5;
    x = this.x+5;
    System.out.println(x);
  }
}
这样我们输出的x就是15

方法的调用也是如此

其实this是实例对象内部指代自身的引用,它可以解决成员变量和局部变量的同名问题,this可以调用成员变量/方法,无法调用局部变量,在普通方法中可以省略this。
但一般不建议省略,因为this相当于成员变量的标志,有助于代码的可读性。

注意:静态方法中不允许使用this

5.super关键字

super关键字代表对当前实例对象的父类的实例对象的引用,super可以直接调用父类的成员变量(非private的)super也可以调用父类的成员方法(非private的),super可以调用直接父类的构造方法,但只限在子类的构造方法中使用且必须是第一条语句。
例如:

class Person1 {
    int add(int x,int y){
        return x+y;
    }
}

class Student1 extends Person1{
    /**
     * 子类Student重写父类Person的方法:
     * int add(int x,int y)
     * @param x
     * @param y
     * @return
     */
    int add(int x,int y){
        //通过super调用父类的add方法
        super.add(1,2);
        return x+y+y;
    }
}

代码地址:
https://gitee.com/yan-jiadou/study/tree/master/Java%E5%9F%BA%E7%A1%80%E5%AD%A6%E4%B9%A0/src/main/java/exa07

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员小牧之

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值