Java中的方法重写和方法重载

本文详细解析了Java中的方法重写与方法重载的概念,并通过具体代码示例展示了两者的区别与联系,适合Java初学者学习。

        今天是去公司上班的第三个星期,因为自身的原因每天写博客的习惯还是有点坚持不下来,所以博客一直丢下了两个星期没写,今天终于又敲起键盘来写博客了。

        这两个星期一直都在公司复习Java基础知识,等待着南方航空公司那边的通知过去考核,说是话实在有点坚持不住了,每天在公司漫无目的的找一些题目来看,复习。一上午下来就有点打瞌睡了,真的希望南方航空那边快点通知过去考核,能过就过,不能过也就在重新找工作呗!也没什么大不了的!但是我对自己的要求是:必须pass!我对自己还是很有信心的。根据最近在复习的情况来看,考Java基础我应该不会有太大的问题。但是如果又考哪些什么软件工程导论啊、C++的话我就没辙了,说实话范围真的有点大,我们的项目组也不好把握啊!在此想问问广大的朋友有没有去南方航空公司那边考过Java相关的试题的?能否贡献一些出来?如果可以,发到我邮箱吧!地址:1035776548@qq.com  谢谢!

       噢噢!不好意思有点偏题了,说回刚刚的方法重写和方法重载!今天我在复习方法重写和方法重载,感觉自己还是不太懂,查找资料后,大概明白了挺多的!下面跟大家分享一下。

       首先方法重写和方法重载是建立在Java的面向对象的继承和多态的特性基础上而出现的。至于面向对象的继承和多态的特性我就不在这里多说了。继承是指在一个父类的基础再创建一个子类,这样子类就拥有了父类的非私有的特性,同时子类还可以扩展自己的特性,这样就引出了方法重写和方法重载!

 

一、方法重写(Override)

        在Java中如何来定义重写:Java程序中类的继承特性可以产生一个子类,子类继承父类就拥有了父类的非私有的属性(方法和变量),在子类中可以增加自己的属性(方法和变量),同时也可以对父类中的方法进行扩展,以增强自己的功能,这样就称之为重写,也称为复写或者覆盖。所谓方法重写就是子类的方法和父类中继承下来的方法具有完全相同的方法名、返回值类型、方法的参数个数以及参数类型,这样才能被称为方法重写。

代码体现:

// 这是父类的定义
public class Person {

    public void eat() {
         System.out.println("=====这是父类Person的eat方法=======");
     }
}

// 这是子类的定义
public class Student extends Person {

    @Override
    public void eat() {
       System.out.println("===这是子类Student的eat方法===");
    }
 
    // main方法测试
   public static void main(String[] args) {
       Student student = new Student();
       student.eat();  //输出:===这是子类Student的eat方法===
     }
}

子类重写父类的方法后,在实例化子类的时候则调用的是子类中的方法,父类的方法就如同被覆盖了一样。如果在子类中需要调用父类的方法,则在子类方法中使用super关键字调用父类的方法,格式:super.父类中的方法名(参数列表)。

     

       重写规则:

在进行方法重写的时候需要遵循以下规则才能实现方法重写:

(一)子类方法的参数列表必须和父类中被重写的方法的参数列表相同(参数个数和参数类型),否则只能实现方法的重载。

(二)子类方法的返回值类型必须和父类中被重写的方法返回值类型相同,否则只能实现方法重载。

(三)在Java规定,子类方法的访问权限不能比父类中被重写的方法的访问权限更小,必须大于或等于父类的访问权限。

(四)在重写的过程中,如果父类中被重写的方法抛出异常,则子类中的方法也要抛出异常。但是抛出的异常也有一定的约束--->子类不能抛出比父类更多的异常,只能抛出比父类更小的异常,或者不抛出异常。例如:父类方法抛出Exception,那么子类就只能抛出IOException或者抛出比Exception小的异常或者不抛出异常。

 

二、方法重载(Overload)

    在Java中如何定义重载:在Java中通过在类中写多个方法,这类方法的方法名相同,方法的参数列表不同(参数的个数和参数类型的不同)来事现方法的重载。所谓方法重载就是:在一个类中,有一系列的方法具有方法名相同,但参数列表不同,这类方法的现就是方法重载。注意构造方法也可以重载。

 

代码体现:

// 这是父类的定义
public class Person {

 /*
  * protected void eat() throws Exception{
  * System.out.println("=====这是父类Person的eat方法======="); }
  */

   public Person() {
        System.out.println("这是无参构造方法");
   }

   public Person(String name) {
        System.out.println("这是有一个参数的构造方法参数name=" + name);
   }

   void print() {
       System.out.println("====无参print方法====");
   }

  void print(String str) {
       System.out.println("====有一个参数的print方法====");
   }

  void print(String str, int a) {
      System.out.println("====有两个参数的print方法====");
   }
}

在对象调用这些方法的时候,Java VM会根据不同的参数列表来执行不同的方法体,这就是多态的一种体现。

 

    重载规则:

在进行方法重载的时候需要遵循以下的规则:

(一)再使用方法重载的时候,必须通过方法中不同的参数列表来实现方法的重载。如:方法的参数个数不同或者方法的参数类型不同。

(二)不能通过访问权限,返回值类型和抛出的异常来实现重载

(三)方法的异常类型和抛出异常的数目不会影响方法的重载,也就是说重载的方法中允许抛出不同的异常

(四)可以有不同的返回值类型,只要方法的参数列表不同即可

(五)可以有不同的访问修饰符

 

三、重写与重载的区别

 

区别点

重载

重写(覆写)

英文

Overloading

Overiding

定义

方法名称相同,参数的类型或个数不同

方法名称、参数类型、返回值类型全部相同

对权限没有要求

被重写的方法不能拥有更严格的权限

范围

发生在一个类中

发生在继承类中

 

注意:构造方法不能被继承,因此不能被重写,在子类中只能通过super关键字调用父类的构造方法;但是可以被重载。

主要参考文章连接:http://blog.youkuaiyun.com/zhangyabinsky/article/details/7047330

主要说明方法重写和方法重载的区别,给Java初学者学习学习!

Java方法重写方法重载都是面向对象编程中多态特性的不同体现,但它们存在诸多区别: - **定义位置**:方法重载是在同一个类中定义多个具有相同名称但参数列表不同的方法方法重写是在子类中定义一个父类中同名、参数列表相同且返回类型相同(或兼容)的方法[^1]。 - **参数列表**:重载要求参数类型个数不同,方法名必须一样;重写要求参数列表必须父类重写方法完全相同[^1][^3]。 - **返回类型**:重载时返回值类型可以一样也可以不一样,不能以返回值类型作为重载方法的区分标准;重写时返回类型必须相同或者是父类方法返回类型的子类(协变返回类型)[^1][^3]。 - **目的**:重载主要用于解决方法的命名冲突提高代码的可读性可维护性;重写主要用于实现多态性,即在运行时根据对象的实际类型来确定要执行的方法[^1]。 - **关键字**:重写可以使用`@Override`注解来显式表明该方法重写父类方法,该注解不是必需的,但使用它可以让编译器帮助检查重写是否正确;重载没有特定的关键字[^1]。 - **抛出异常**:重写时,子类方法不能抛出比父类方法更多的异常;重载对抛出异常没有特殊要求。 - **权限控制符**:重写时,子类方法的访问权限不能比父类方法更严格;重载不受访问权限的限制。 以下是方法重载方法重写的示例代码: ```java // 方法重载示例 class Calculator { int add(int a, int b) { return a + b; } double add(double a, double b) { return a + b; } } // 方法重写示例 class Animal { void move() { System.out.println("The animal can move."); } } class Dog extends Animal { @Override void move() { System.out.println("The dog is running."); } } class Main { public static void main(String[] args) { // 方法重载调用 Calculator calculator = new Calculator(); System.out.println(calculator.add(1, 2)); System.out.println(calculator.add(1.5, 2.5)); // 方法重写调用 Animal animal = new Animal(); animal.move(); Dog dog = new Dog(); dog.move(); } } ```
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Seven的代码实验室

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

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

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

打赏作者

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

抵扣说明:

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

余额充值