软件构造笔记---Java中的重写和重载

Java中的重写和重载

重写和重载是java中经常用到的两个概念本篇文章来对它们进行区分

方法的重写(Overriding)和重载(Overloading)是Java多态性的不同表现
重写(Overriding):是父类与子类之间多态性的一种表现。如果在子类中定义某方法与其父类有相同的名称和参数,我们说该方法被重写 (Overriding) 。子类的对象使用这个方法时,将调用子类中的定义,对子类的对象而言,父类中的定义如同被屏蔽了。
例如下面的例子:

class Person{
     void work(){ System.out.print("person work");}
}
class Xiaoming extends Person{
     void work(){System.out.print("Xiaoming work");}
}

子类中的work方法即对父类的work方法实现了重写,重写最常见的例子就是下面的声明:

Person person = new Xiaoming()

重写需要遵循以下的规则:
1.重写方法必须和被重写方法具有相同的参数列表,返回类型必须和被重写方法的返回类型相同或者是返回类型的子类型。
2.重写的方法的访问修饰符不能比原方法更严格,比如在父类中方法声明为public,在重写方法中不能被定义成private。
3.重写的方法所抛出的异常必须和原方法的所抛出的异常一致,或者是其子类。
4.方法被定义为final不能被重写。
5.对于继承来说,如果某一方法在父类中是访问权限是private,那么就不能在子类对其进行重写覆盖,如果定义的话,也只是定义了一个新方法,而不会达到重写覆盖的效果。(通常存在于父类和子类之间)
6.重写的方法可以使用 @Override 注解来标识。
例:
父类

public class Animal {
    public String name; // 名字
    public int age; // 年龄
    public Animal(String name, int age) {
        this.name = name;
        this.age = age;
    }
    public String getInfo() {
        return "我叫" + name + ",今年" + age + "岁了。";
    }
}

子类

public class Cat extends Animal {
    private String hobby;
    public Cat(String name, int age, String hobby) {
        super(name, age);
        this.hobby = hobby;
    }
    public String getInfo() {
        return "大家好!我叫" + this.name + ",我今年" + this.age + "岁了,我爱吃" + hobby + "。";
    }
    public static void main(String[] args) {
        Animal animal = new Cat("小花", 2, "鱼");
        System.out.println(animal.getInfo());
    }
}

如上述代码,在 Animal 类中定义了一个返回值类型为 String、名称为 getInfo() 的方法,而 Cat 类继承自该类,因此 Cat 类同样含有与 Animal 类中相同的 getInfo() 方法。但是我们在 Cat 类中又重新定义了一个 getInfo() 方法,即重写了父类中的 getInfo() 方法。

在 main() 方法中,创建了 Cat 类的对象 animal,并调用了 getInfo() 方法。输出的结果如下:

大家好!我叫小花,我今年2岁了,我爱吃鱼

重载(Overloading):是一个类中多态性的一种表现。如果在一个类中定义了多个同名的方法,它们或有不同的参数个数或有不同的参数类型或有不同的参数次序,则称为方法的重载(Overloading)。
方法重载的要求是两同一不同:同一个类中方法名相同,参数列表不同。至于方法的其他部分,如方法返回值类型、修饰符等,与方法重载没有任何关系。
按照范围,可以将重载分为在一个类中重载,和在子类和父类中重载。
1.在一个类中定义多个具有相同签名的方法,这些方法必须具有不同的参数列表。
2.在父类和子类中,子类由于继承而拥有了父类的某些方法,此时在子类再定义具有相同签名的方法(必须具有不同的参数列表)
例:

public class OverLoading {
    public void max(int a, int b) {
        // 含有两个int类型参数的方法
        System.out.println(a > b ? a : b);
    }
    public void max(double a, double b) {
        // 含有两个double类型参数的方法
        System.out.println(a > b ? a : b);
    }
    public void max(double a, double b, int c) {
        // 含有两个double类型参数和一个int类型参数的方法
        double max = (double) (a > b ? a : b);
        System.out.println(c > max ? c : max);
    }
    public static void main(String[] args) {
        OverLoading ol = new OverLoading();
        System.out.println("1 与 5 比较,较大的是:");
        ol.max(1, 5);
        System.out.println("5.205 与 5.8 比较,较大的是:");
        ol.max(5.205, 5.8);
        System.out.println("2.15、0.05、58 中,较大的是:");
        ol.max(2.15, 0.05, 58);
    }
}

编译、运行上面程序完全正常,虽然 3 个 max() 方法的方法名相同,但因为它们的形参列表不同,所以系统可以正常区分出这 3 个方法。当运行时,Java 虚拟机会根据传递过来的不同参数来调用不同的方法。运行结果如下:

1 与 5 比较,较大的是:
5
5.205 与 5.8 比较,较大的是:
5.8
2.15、0.05、58 中,较大的是:
58.0

以上就是重写和重载的实现和区别,欢迎批评指正!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值