实现类的多态性,方法的重写和重载
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;//定义一个用于表示圆周率的常量PIpublic 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);//获得矩形的面积,并赋予rectangleAreaSystem.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.以上就是通过方法的重写和重载实现类的多态性,仅供大家学习参考,写得不好,请见谅,如有错误请指出,谢谢!
实现类的多态性,方法的重写和重载相关推荐
- 方法的重写和重载,接口和抽象类区别
方法的重写和重载,接口和抽象类区别,新手入门必看!!!!!要记住 方法的重写和重载 重写 重载 接口和抽象类 说明 方法的重写和重载 重写 在Java程序中,类的继承关系可以产生一个子类,子类继承父类 ...
- 009-对象—— 构造方法__construct析构方法__destruct使用方法 PHP重写与重载
<?php /**构造方法__construct析构方法__destruct使用方法 PHP重写与重载*/ //构造方法:当实例化对象时,自动运行的方法 /*class channel{func ...
- Java Object类中toString方法的重写
Object类中的tostring方法的: 当我们输出一个对象时,实际是输出的是这个类中的tostring方法,是一个地址值,而不是类中的属性. 一:子类没有重写Object类中的toStrinng方 ...
- C# 继承实现父类方法、重写、重载
继承是派生类(子类)去实现(重写<override>.重构<new>)基类(父类)的方法或属性.从而获取在派生类中要实现的功能. 子类调用父类构造方法,在父类中有个实现姓名和年 ...
- java 多态与重载的区别_java实现多态 方法的重写和重载的区别
1.方法的重写 思路:先写一个父类People,在类中定义一个 print方法 ,然后写一个子类 Student 继承父类,重写print方法. //父类 class People{ public v ...
- 方法的重写、重载及隐藏
首先,重写和隐藏是发生在两个类中的,而重载可以发生在一个类中. 重写的概念就是顾名思义了:重新写一遍:方法名.参数及返回值是一模一样的,可能实现的过程不一样,为什么要重写?因为原来的方法不够perfe ...
- 父子类之间,成员函数重写、重载以及重定义的区别
1.重写override:也叫做覆盖.子类重新定义父类中有相同名称和参数列表的虚函数.函数特征相同. 重写需要注意: 1) 被重写的函数不能是static的.必须是virtual的 2) 重写函数必须 ...
- Java中方法的重写(overriding)和重载(overloading)的区别
Java中方法的重写(overriding)和重载(overloading) 重写 在子类中可以根据需要对从父类中继承来的方法进行改造,也称为重置.覆盖. 在子类中创建一个和父类中的一个相同名字.相同 ...
- Java的访问控制权限、构造函数、类初始化顺序、重写与重载
1. Java的访问控制权限 1.1 访问控制权限总体描述 1.2 类的访问控制权限 2. Java构造函数 2.1 构造函数的类型 2.2 构造函数的特性 2.3 子类如何访问父类的构造函数? 2. ...
最新文章
- 数据结构 单链表 C
- DevExpress助您开发Windows8 UI应用程序
- SasSHRM中基于shiro的认证授权:系统微服务配置shiro
- 如何查看redis占用内存大小
- FreeBSD磁盘标签实例分析
- swift-延时加载函数
- 中文的在一个字符串中查找另一个字符
- 关于VC6.0一些常见问题和解决方案
- java 快逸报表_数据填报 | 快逸报表工具-Java报表软件
- 基于MATLAB的机械振动合成规律研究,基于MATLAB的机械振动分析研究
- CIM系统与MES系统介绍
- 增强型植被指数——EVI
- 【转载】project2019安装教程
- android barchart设置标题,android - 如何设置MPAndroidChart BarChart的高度和宽度? - 堆栈内存溢出...
- get请求400错误 vue_VUE 配置proxy代理后,前台报错400 bad request
- MacOS自带ssh+XQuartz连接OpenBSD6.5
- anguarjs 上传图片预览_前端战五渣学前端——FileReader预览本地文件
- 【python】numpy.percentile()函数
- php编程入门先学什么 PHP程序员需要具备哪些技能
- 论文写作各种图片格式转成eps格式(inkscape)
热门文章
- HBuilder 模拟器
- [剑指offer] 61. 序列化二叉树
- Spring Boot2.0之 原理—创建内置Tomcat容器
- HDOJ 4005-The war解题报告
- JDBC之用元数据将结果集封装为List对象
- 我在项目中用到的vue FullCalendar的内置函数以及配置项
- 小程序入门到精通(二):了解小程序开发4个重要文件
- Function(函数)
- php 上传 blob,Laravel框架+Blob实现的多图上传功能示例
- mantis apache mysql_Debian下mysql5+php5+apache2+mantis服务器升级