说一下重载和重写分别是什么?

重载

重载 就是在同一个类里面,允许存在两个或两个以上方法名相同 的方法,前提是参数列表必须不同

先看第一个错误代码。

java 复制代码
public class OverloadTest {

    public static int test(int a) {
        return a + 10;
    }
    
    public static String test(int b) {
        return "大家好,我是整数" + a;
    }
}

这段代码报错,原因是,重载必须要求参数列表不同,注意参数名不同不算参数列表不同,参数列表都是只有一个int。

再看第二个错误代码。

java 复制代码
public class OverloadTest {
    public static void test(int a) {
        System.out.println("大家好,我是" + a);
    }

    public static int test(int a) {
        return a + 10;
    }
}

这段代码报错,原因也是参数列表必须不同,不是说返回值不同,编译器就会通过。

虽然返回值不同也可以唯一标识一个方法,但是编译不过的。

不能通过返回值不同来判断重载

正确的重载大概是这样的。

java 复制代码
package com.wuqingshun.utils;

public class OverloadTest {
    public static void test(String name) {
        System.out.println("大家好,我是" + name);
    }

    public static int test(int a) {
        return a + 10;
    }
}

对于每个被重载的方法,必须要满足

in 复制代码
1、方法名一定相同
2、参数列表一定不同,只是参数名不同不算参数列表不同。
3、对返回值没有要求(可以相同也可以不同),不能通过返回值不同来判断重载。

重写

当父类的某个方法无法满足业务需求 的时候,就需要子类去重新编写父类的方法,如果子类重写了父类的方法,调用时就会调用子类重写过的方法。

例如

java 复制代码
public class Father {
    public void say() {
        System.out.println("我是父类方法");
    }
}
java 复制代码
public class Son extends Father{
    @Override
    public void say() {
        System.out.println("我是子类方法");
    }
}
java 复制代码
public class Main {
    public static void main(String[] args) {
        Father f = new Father();
        Father s = new Son();
        f.say();
        s.say();
    }
}

输出结果

out 复制代码
我是父类方法
我是子类方法

再看一段错误代码

java 复制代码
public class Father {
    public void say(){
        System.out.println("我是父类方法");
    }
}
java 复制代码
public class Son extends Father{
    @Override
    public void say() throws FileNotFoundException {
        FileOutputStream stream = new FileOutputStream("D:\\code\\java\\java-demo\\pom.xml");
        System.out.println("我是子类方法");
    }
}

程序编译报错

in 复制代码
重写的方法未抛出 'java.io.FileNotFoundException'

这是因为只能抛出父类声明过的异常或其子类异常

父类没有抛出FileNotFoundException,子类也不能抛出。

一般来说,我们重写父类方法的时候,保持方法名字,返回值,参数列表,权限修饰符的一致。但是实际上,有些东西可以不用完全一致

具体的规则是:

in 复制代码
1、方法名,参数列表必须一致
2、返回值可以是父类返回值的子类,例如父类返回Object,我重写可以返回String
3、访问修饰符只要不低于父类就行,例如父类用protect我们可以用public和protect,不能用defalut和private
4、只能抛出父类声明过的异常或其子类异常,运行时异常不受限制。

面试

重载就是在同一个类里面,允许存在两个或两个以上方法名相同的方法,前提是参数列表必须不同,不能通过返回值不同来判断重载。

当父类的某个方法无法满足业务需求的时候,就需要子类去重新编写父类的方法,这就是重写。如果子类重写了父类的方法,调用时就会调用子类重写过的方法。

相关推荐
方也_arkling2 小时前
【Java-Day08】static / final / 枚举
java·开发语言
橙淮2 小时前
Spring Bean作用域与生命周期全解析
java·spring
风吹夏回2 小时前
Python 全局异常处理:从“满屏 try-except”到优雅兜底
开发语言·python
Chengbei113 小时前
一站式源码安全检测工具、云安全 / APP / 小程序源码敏感信息递归多层目录扫描AK、JWT、手机号、身份证等敏感信息
java·开发语言·安全·web安全·网络安全·系统安全·安全架构
llz_1123 小时前
web-第一次课后作业
java·开发语言·idea
小熊Coding3 小时前
Python爬取当当网二手图书项目实战!
开发语言·爬虫·python·beautifulsoup·requests·二手图书
秋93 小时前
Java项目运行5天左右自动宕机:系统性定位与解决方案
java·开发语言·python
小江的记录本3 小时前
【JVM虚拟机】垃圾回收GC:垃圾收集器:CMS:核心原理、回收流程、优缺点、废弃原因(附《思维导图》+《面试高频考点清单》)
java·jvm·后端·python·spring·面试·maven
xiaoshuaishuai83 小时前
C# 内存管理与资源泄漏
开发语言·c#
DIY源码阁3 小时前
JavaSwing学生成绩管理系统 - MySQL版
java·数据库·mysql·eclipse