实现类的多态性,方法的重写和重载

本文详细介绍了Java中多态性的实现方式,包括方法重写和重载的概念与应用实例。通过具体的代码示例展示了如何利用多态性实现类的行为多样化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.多态性是面向对象程序设计的重要部分。在Java语言中,通过使用方法的重载和重写实现类的多态性。

2.重写(覆盖)是指父子类之间的关系,当子类继承父类中所有可能被子类访问的成员方法时,如果子类的方法名与父类的方法名相同,那么子类就不能继承父类的方法,这时,称为子类的方法重写了父类的方法。重写体现了子类补充或者改变父类方法的能力。通过重写,可以使一个方法在不同的子类中表现出不同的行为。多态其实不依赖具体类,依赖抽象类和接口,接下来附上一个例子:

目录结构:


Animal.java文件:

package tom.bean;

/*
 * 定义一个动物类,作为父类
 */
public class Animal {
	public Animal(){	//无参构造方法
	}
	
	public void eat(){	//eat()方法
		System.out.println("动物吃东西");
	}
}


Dog.java文件:

package tom.bean;

/*
 * 定义一个狗类,作为动物类的子类,继承动物类
 */
public class Dog extends Animal{
	public Dog(){	//无参构造方法
	}
	
	public void eat(){	//eat()方法,重写了Animal类的eat()方法
		System.out.println("狗吃狗粮");
	}
}


Cat.java文件:

package tom.bean;

/*
 * 定义一个猫类,作为动物类的子类,继承动物类
 */
public class Cat extends Animal{
	public Cat(){	//无参构造方法
	}
	
	public void eat(){	//eat()方法,重写了Animal类的eat()方法
		System.out.println("猫吃猫粮");
	}
}

Tiger.java文件:

package tom.bean;

/*
 * 定义一个Tiger老虎类,继承Animal动物类
 */
public class Tiger extends Animal {
}



Test.java文件,测试类:

package tom.test;

import tom.bean.Cat;
import tom.bean.Dog;
import tom.bean.Tiger;

/*
 * 测试类,打印输出信息
 */
public class Test {
	public static void main(String[] args){
		Dog dog=new Dog();//创建Dog类的对象
		System.out.println("执行dog.eat();语句后的结果:");
		dog.eat();//调用eat()方法
		Cat cat=new Cat();//创建Cat类的对象
		System.out.println("执行cat.eat();语句后的结果:");
		cat.eat();//调用eat()方法
		Tiger tiger=new Tiger();//创建Tiger对象
		System.out.println("执行tiger.eat();语句的结果:");
		tiger.eat();//调用eat()方法,此时调用的是父类的eat()方法
	}
}


运行Test.java文件后,结果为:

从上面的例子可以知道,Dog类和Cat类都重写了父类的eat()方法,所以执行的是子类的eat()方法,但是Tiger类没有重写父类的方法,所以执行的是父类中的eat()方法。

3.方法的重载是指在一个类中出现多个方法名相同,但参数个数或参数类型不同的方法,则称为方法的重载。Java语言在执行该具有重载关系的方法时,将根据调用参数的个数和类型区分具体执行的是哪个方法。下面给出一个例子:定义一个Shape类,在类中定义两个名称为getArea()的方法(参数个数不同)和两个名称为draw()的方法(参数类型不同):

Shape.java文件:

package tom.bean;

public class Shape {
	final float PI=3.14159f;//定义一个用于表示圆周率的常量PI
	
	public float getArea(float r){	//定义一个用于计算面积的方法getArea(),求圆形的面积
		float area=PI*r*r;
		return area;
	}
	
	public float getArea(float length,float width){	//重载getArea()方法,用来求矩形的面积,重载方法带的参数个数不同
		float area=length*width;
		return area;
	}
	
	//画任意形状的图形
	public void draw(int num){	//定义一个用于画图的方法draw()
		System.out.println("画一个"+num+"个任意形状的图形");
	}
	
	//画指定形状的图形
	public void draw(String shape){	//重载draw()方法,重载方法中带的参数类型不同
		System.out.println("画一个"+shape);
	}
	
	//主方法
	public static void main(String[] args){
		Shape shape=new Shape();//创建Shape类的对象
		float l=10;//声明一个常量,初始化为10,表示矩形的长
		float w=20;//声明一个常量,初始化为20,表示矩形的宽
		float rectangleArea=shape.getArea(l, w);//获得矩形的面积,并赋予rectangleArea
		System.out.println("长度为"+l+",宽度为"+w+"的矩形面积为:"+rectangleArea);//打印输出矩形的面积
		float r=5;
		float circleArea=shape.getArea(r);
		System.out.println("半径为"+r+"的圆形的面积为:"+circleArea);
		shape.draw(3);//调用draw()方法
		shape.draw("圆锥");
	}
}

运行此程序,结果为:

 

注:重载的方法直接并不一定必须有联系,但是为了提高程序的可读性,一般只重载功能相似的方法,在进行方法的重载时,方法返回值的类型不能作为区分方法的标志!

4.以上就是通过方法的重写和重载实现类的多态性,仅供大家学习参考,写得不好,请见谅,如有错误请指出,谢谢!


某公司的员工有经理Manager、技术人员Technicist营销人员SalsePerson,他们的薪金计算方法如下: 经理按月计酬,方法是:基本工资+奖金;技术人员按月计酬,方法是:基本工资;营销人员按月计酬,方法是:基本工资+销售利润*5%。 每类人员都有职工编号、姓名、性别、入职时间、职位、基本工资等数据,其中为入职时间定义Date类,并为该类重载运算符<<,实现入职时间的输入;各类人员使用统一接口getpay()计算各类人员的月薪。其次,设计一个统计并输出该公司每个人员某几个月薪金情况的报表类Report,该类提供add接口向Report类的容器中添加员工信息,并提供print接口用于输出每个员工的职工编号、姓名、性别、入职时间、职位在设定的月份时间段中该员工的薪酬总额。为了方便实现查找功能,为Report类重载[]运算符的功能,下标值为职位,能根据职位信息查找出所有符合该职位的员工,并重载print接口,输出查找出的员工信息,信息包括职工编号、姓名、性别、入职时间、职位、基本工资。在主函数中对实现的类进行测试,首先,创建各类人员对象,通过Report类的add接口向报表中添加这些人员信息,然后通过Report类的print接口输出报表。其次测试报表的查找功能,输入要查找的员工职位信息,通过Report类的print接口输出查找到的员工基本信息报表。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值