Java中的重载、重写和重构的区别

Java中的重载、重写和重构的区别1、重载重载(overloaded):重载就是在同一个类中允许同时存在一个以上的同名方法,只要这些方法的参数个数或类型不同即可。我们知道构造方法的名称已经由类名决定,所以构造方法只有一个名称,但如果希望以不同的方式来实例化对象,就需要使用多个构造方法来完成。由于这些构造方法都需要根据类名进行命名,为了让方法名相同而形参不同的构造方法同时存在,必须用到“方法重载”,虽然方法重载起源于构造方…

大家好,又见面了,我是你们的朋友全栈君。

1、重载

重载(overloaded): 重载就是在同一个类中允许同时存在一个以上的同名方法,只要这些方法的参数个数或类型不同即可。

我们知道构造方法的名称已经由类名决定,所以构造方法只有一个名称,但如果希望以不同的方式来实例化对象,就需要使用多个构造方法来完成。由于这些构造方法都需要根据类名进行命名,为了让方法名相同而形参不同的构造方法同时存在,必须用到“方法重载”,虽然方法重载起源于构造方法,但是它也可以应用到其他方法中。

示例:在项目中创建OverLoadTest类,在类中编写add()方法的多个重载形式,然后在主方法中分别输出这些方法的返回值。

/**
 * 重载示例
 * 
 * @author pan_junbiao
 *
 */
public class OverLoadTest
{
	public static int add(int a, int b)
	{
		return a + b;
	}

	public static int add(int a, int b, int c)
	{
		return a + b + c;
	}

	public static double add(double a, double b)
	{
		return a + b;
	}

	/**
	 * 定义不定长参数方法
	 */
	public static int add(int... a)
	{
		int s = 0;
		for (int i = 0; i < a.length; i++)
		{
			s += a[i];
		}
		return s;
	}

	public static void main(String[] args)
	{
		System.out.println("调用add(int,int)方法:" + add(1, 2));
		System.out.println("调用add(int,int,int)方法:" + add(1, 2, 3));
		System.out.println("调用add(double,double)方法:" + add(2.1, 3.5));
		// 调用不定长参数方法
		System.out.println("调用不定长参数方法:" + add(1, 2, 3, 4, 5, 6, 7, 8, 9));
		System.out.println("调用不定长参数方法:" + add(1, 2));
	}
}

执行结果:

Java中的重载、重写和重构的区别

注意:虽然在方法重载中可以使用两个方法的返回类型不同,但只有返回类型不同并不足以区分两个方法的重载,还需要通过参数的个数以及参数的类型来设置。

重载的规则:

(1)必须具有不同的参数列表。

(2)可以有不同的返回类型,只要参数列表不同就可以了。

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

(4)可以抛出不同的异常。

 

2、重写

重写(override):重写(还可以称为覆盖)就是在子类中将父类的成员方法的名称保留,重写成员方法的实现内容,更改成员方法的存储权限,或是修改成员方法的返回值类型(注意:重写父类成员方法的返回值类型是基于J2SE 5.0版本以上编译器提供的新功能)。

示例:在项目中创建Parent类和Children类,在Parent类中编写成员方法doSomething()和doIt(),使Children类继承Parent类,重写父类的这两个方法和构造方法,并新增doSomethingNew()方法。其中Children类的构造方法中使用super关键字调用父类的构造方法和成员方法等。

(1)创建Parent父类:

/**
 * 父类
 * 
 * @author pan_junbiao
 *
 */
public class Parent
{
	/**
	 * 构造方法
	 */
	public Parent()
	{
		System.out.println("父类构造方法!");
	}

	/**
	 * 成员方法
	 */
	protected void doSomething()
	{
		System.out.println("父类方法");
	}

	/**
	 * 成员方法,返回类型为Parent类型
	 */
	protected Parent doIt()
	{
		return new Parent();
	}
}

(2)创建Children子类,并继承父类:

/**
 * 子类
 * 
 * @author pan_junbiao
 *
 */
public class Children extends Parent // 继承父类
{
	/**
	 * 构造方法
	 */
	public Children()
	{
		// 调用父类构成方法
		super();

		// 调用父类成员方法
		super.doSomething();

		// 子类构造方法
		System.out.println("子类构造方法");
	}

	/**
	 * 子类新增方法
	 */
	public void doSomethingNew()
	{
		System.out.println("子类新增方法");
	}

	/**
	 * 重写父类方法
	 */
	public void doSomething()
	{
		System.out.println("子类重写父类方法");
	}

	/**
	 * 重写父类方法,返回类型为Children类型
	 */
	protected Children doIt()
	{
		return new Children();
	}
}

子类重写父类的方法还可以修改方法的返回值类型,但这只是在J2SE 5.0以上的版本中支持的新功能。示例中子类中的doIt()方法就使用了这个新功能,父类中的doIt()方法的返回值类型为Parent类,而子类中的doIt()方法的返回值类型为Children类,子类中重写了父类的doIt()方法。这种重写方式需要遵循一个原则,即重写的返回值类型必须是父类中同一方法返回值类型的子类,而Children类正是Parent类的子类。

注意:当重写父类方法时,修改方法的修饰权限只能从小的范围到大的范围改变,例如,父类中的dosomething()方法的修饰权限为protected,继承后子类中的方法doSomething()的修饰权限只能修改为public,不能修改为private。

重写的规则:

(1)参数列表必须完全与被重写的方法相同,否则不能称其为重写而是重载。

(2)访问修饰符的限制一定要大于被重写方法的访问修饰符(public>protected>default>private)。

(3)重写方法一定不能抛出新的检查异常或者比被重写方法申明更加宽泛的检查型异常。例如:父类的一个方法申明了一个检查异常IOException,在重写这个方法是就不能抛出Exception,只能抛出IOException的子类异常,可以抛出非检查异常。

 

3、重构

重构:是重写的一种特殊方式,子类与父类的成员方法的返回值、方法名称、参数类型及个数完全相同,唯一不同的是方法实现内容,这种特殊重写方式被称为重构。

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/156979.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • 常用的DNS列表(亲测可用)

    常用的DNS列表(亲测可用)如果经常遇到这样的问题:浏览器无法打开网站,但是qq、微信是正常使用的,说明DNS有问题。我们知道,默认情况下DNS是自动获取的,通常默认DNS就是路由器,然后由路由器负责向上一级路由查找,但是有时候路由器出现问题就可能造成上面的问题,那么如何一劳永逸的解决上面的问题呢?答案就是修改DNS,在手机、电脑上都可以更改,具体根据机型自行查找资料。以下是一些常用的DNS地址,亲测可用哦~…

  • scrollHeight,clientHeight,scrollTop

    scrollHeight,clientHeight,scrollTop移动端加载数据时,由于数据太多,不会一次性全部加载出来。有些会采用pc端那样用分页码的形式,但是更多的确实滑动滚动条到内容最后,加载更多内容出来。一般引入了三方的前端框架和插件,基本都会有此功能。偶尔会需要采用原生js实现,故而此处就介绍下原生js的实现方式。另外附上jquery的实现方式。原生js实现思路需要三个高度:scrollHeight(文档内容实际高度,包括超出视窗的溢出部分)、scrollTop(滚动条滚动距离)、clientHeight(窗口可视范围高度)。当clientHeig

  • C#单纯的字母数字ASCII码转换

    字母转换成数字byte[]array=newbyte[1];//定义一组数组arrayarray=System.Text.Encoding.ASCII.GetBytes(string

    2021年12月27日
  • 高通msm8916 LK阶段配置使用i2c5

    高通msm8916 LK阶段配置使用i2c5背景:在调试SLM753某客户项目LCM时,客户使用LVDS的LCM,而msm8916只有一个mipi的接口,所以就是用到了mipi-2-lvds转换芯片:icn6202。这颗芯片需要使用I2C进行配置LVDS屏的时钟和分辨率等信息,以至于LVDS屏可以正常显示。Kernel阶段i2c比较容易使用,只需在dts中配置一个i2c设备即可以使用对应的i2c接口进行数据传输,但是LK阶段的代码就显得

    2022年10月19日
  • 模拟电子技术之运算放大器「建议收藏」

    模拟电子技术之运算放大器「建议收藏」上一篇文章对放大电路做了简单的介绍,相信大家对”放大”这个概念已经有了一定的了解,下面我们来看一下运算放大器运算放大器及其信号放大运算放大器的基本线性应用1.运算放大器及其信号放大集成运算放大器是一种应用极为广泛的模拟器件。用集成运算放大器可以非常方便地实现信号的放大、运算、变换等各种处理。常见的运放电路符号有矩形和三角形两种电路符号这里我们采用三角形符号端口意义运算放大器正常工作时,必须提供工作电源,通常正负电源的连接方式为:实际运放外部引脚实例来看一下实际的电子元器件:运

  • 数据库 部分函数依赖 完全函数依赖 传递函数依赖 第一范式、第二范式、第三范式、BCNF范式区别

    数据库 部分函数依赖 完全函数依赖 传递函数依赖 第一范式、第二范式、第三范式、BCNF范式区别数据库部分函数依赖完全函数依赖传递函数依赖第一范式、第二范式、第三范式、BCNF范式区别在理解函数依赖之前,先来看一下函数依赖分析:在关系中,包括在任何候选码中的属性称为主属性;不包括在任何候选码中的属性称为非主属性。函数依赖只分析关系中的非主属性对主属性之间的依赖关系,并不分析主属性对主键(码)的依赖关系。具体关于部分函数依赖和完全函数依赖的定义,网上有很…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号