【小家java】关于java中方法重载与方法重写的区别

简介: 【小家java】关于java中方法重载与方法重写的区别

相关阅读

【小家java】java5新特性(简述十大新特性) 重要一跃

【小家java】java6新特性(简述十大新特性) 鸡肋升级

【小家java】java7新特性(简述八大新特性) 不温不火

【小家java】java8新特性(简述十大新特性) 饱受赞誉

【小家java】java9新特性(简述十大新特性) 褒贬不一

【小家java】java10新特性(简述十大新特性) 小步迭代

【小家java】java11新特性(简述八大新特性) 首个重磅LTS版本


1、概述


这篇文章比较轻松,直接讲述一下java当中的方法重载和方法重写的区别。主要面向对象还是初学者,因为初学者经常弄混这两个概念性的问题。


2、栗子


一、重载 overloading,这个在JDK里可没有相关注解哦


方法重载是让类以统一的方式处理不同类型数据的一种手段。重载是一个类中多态性的一种表现。


Java的方法重载,就是可以在类里定义多个同名的方法,但具有不同的参数和不同的定义(不同的参数列表)。调用方法时才决定最终调用哪个方法,这也是多态性的表现。这里推荐大家可以了解一下java当中的重载决策,可以参考我另外一篇博文中有说到过:List 的删除操作,你知道多少?


里面对remove重载解释的时候有介绍到,各位有空可以看看。

比如spring框架中BeanFactory.getBean()方法,就有大量的重载实现:


Object getBean(String name) throws BeansException;
<T> T getBean(String name, Class<T> requiredType) throws BeansException;


重载用得好,也可大大提高你的代码设计的向下兼容能力。


重载的返回值类型可以相同也可以不同


二、重写overriding。强烈建议如果是重写,请加上方法注解:@Override


父类(接口)与子类之间的多态性,对父类的函数进行重新定义。如果在子类中定义某方法与其父类有相同的名称和参数,我们说该方法被重写 (Overriding),@Override并不是必须的,但建议加上保持良好语意,也能静态检查。


若子类中的方法与父类中的某一方法具有相同的方法名、返回类型和参数表,则新方法将覆盖原有的方法。如需父类中原有的方法,可使用super关键字,该关键字引用了当前类的父类。


子类函数的访问修饰权限不能少于父类的;

有如下父类方法GenericService.test:

protected Object test(Object id) {
  return null;
}

我们复写可以这么来:

@Override
protected Object test(Object id) {
    return null;
}
//使用public修饰
@Override
public Object test(Object id) {
    return null;
}
//使用final修饰也可以
@Override
public final Object test(Object id) {
    return null;
}
//返回值用子类也行,这里用了user对象(用父类就不行了哟)
@Override
public final User test(Object id) {
    return null;
}
//但不能用private修饰了,因为private小于protected   **下面这个就是错的**
@Override
private User test(Object id) {
    return null;
}


备注:入参必须一模一样,类型也是。但返回值允许返回是父类的子类,访问权限可以比父类高。复写的方法还可额外 static 、final、 native 、 synchronized等修饰


另外,接口中如果存在继承,子接口也是可以@Override父接口的哟,这个在平常使用经常遇到,这样具体子接口就能有更好的语意了。


3、使用场景


处处都有

4、最后


若方法类型为priavte static final ,java采用静态编译,编译器会准确知道该调用哪个方法。因此本人建议,能private的方法尽量不要public,因为JVM能够对private方法进行静态编译,从而大大提高调用效率的。


相关文章
|
1天前
|
Java 编译器
【Java开发指南 | 第十九篇】Java方法
【Java开发指南 | 第十九篇】Java方法
9 0
|
1天前
|
Java
判断不为空和不为空串的方法java
判断不为空和不为空串的方法java
|
1天前
|
Java 编译器
【Java开发指南 | 第十七篇】Java 方法
【Java开发指南 | 第十七篇】Java 方法
8 1
|
1天前
|
Java
【Java开发指南 | 第九篇】访问实例变量和方法、继承、接口
【Java开发指南 | 第九篇】访问实例变量和方法、继承、接口
13 4
|
1天前
|
Java 开发框架 XML
JDK、JRE、Java SE、Java EE和Java ME有什么区别?
JDK、JRE、Java SE、Java EE和Java ME有什么区别?
|
1天前
|
Java
java一分钟之-字符流与字节流的区别
【5月更文挑战第11天】Java的输入输出通过流操作,分为字符流和字节流。字节流处理二进制数据,如图片、音频,基类是`InputStream`和`OutputStream`;字符流处理文本,基类是`Reader`和`Writer`。字符流涉及编码转换,字节流不涉及。易错点包括乱码(需指定编码)、混用流类型和忘记关闭流。示例展示了字节流和字符流读文件。理解区别并注意编码和资源管理可提高代码质量。
36 3
|
1天前
|
XML JavaScript Java
详解Java解析XML的四种方法
详解Java解析XML的四种方法
15 1
|
1天前
|
存储 Java API
掌握8条方法设计规则,设计优雅健壮的Java方法
掌握8条方法设计规则,设计优雅健壮的Java方法
|
1天前
|
Java C语言
详解java方法与递归
详解java方法与递归
11 3
|
1天前
|
安全 Java 编译器
Java中String、StringBuilder和StringBuffer的区别
Java中String、StringBuilder和StringBuffer的区别
10 1