博客
关于我
Java中继承与多态的理解
阅读量:314 次
发布时间:2019-03-04

本文共 2214 字,大约阅读时间需要 7 分钟。

多态性就是指父类的某个方法被其子类重写时,可以各自产生自己的功能行为。

当一个类有很子类时,并且这些子类都重写了父类中的某个方法。那么当我们把子类创建的对象的引用放到一个父类的对象中时,就得到了该对象的一个上转型对象,这个上转型对象在调用这个方法时就可能具有多种形,因为不同的子类在重写父类的方法时可能产生不同的行为

多态性是面向对象编程的又一个重要特征,它是指在父类中定义的属性和方法被子类继承之后,可以具有不同的数据类型或表现出不同的行为,这使得同一个属性或方法在父类及其各个子类中具有不同的含义。

对面向对象来说,多态分为编译时多态运行时多态。其中编译时多态是静态的,主要是指方法的重载,它是根据参数列表的不同来区分不同的方法。通过编译之后会变成两个不同的方法,在运行时谈不上多态。而运行时多态是动态的,它是通过动态绑定来实现的,也就是大家通常所说的多态性。
 实现多态有 3 个必要条件:继承、重写和向上转型。只有满足这 3 个条件,开发人员才能够在同一个继承结构中使用统一的逻辑实现代码处理不同的对象,从而执行不同的行为。

  • 继承:在多态中必须存在有继承关系的子类和父类。
  • 重写:子类对父类中某些方法进行重新定义,在调用这些方法时就会调用子类的方法。
  • 向上转型:在多态中需要将子类的引用赋给父类对象,只有这样该引用才既能可以调用父类的方法,又能调用子类的方法。
class 动物{	void cry(){		}}class 狗 extends 动物{	void cry(){		System.out.println("这是狗叫的声音:***");	}}class 猫 extends 动物{	void cry(){		System.out.println("这是猫叫的声音:~~~");	}}public class Example5_10 {	public static void main(String[] args) 	{		动物 animal = new 狗();  //狗的上转型对象		animal.cry();		animal = new 猫();  //狗的上转型对象		animal.cry();	}}

下面通过一个例子来演示重写如何实现多态性。例子使用了类的继承和运行时多态机制,具体步骤如下。

1)创建 Figure 类,在该类中首先定义存储二维对象的尺寸,然后定义有两个参数的构造方法,最后添加 area() 方法,该方法计算对象的面积。代码如下:

public class Figure {	double dim1;	double dim2;	Figure(double d1, double d2){		//有参构造函数		this.dim1 = d1;		this.dim2 = d2;	}	double area(){		//计算对象面积		System.out.println("父类中计算对象的方法,没有实际意义,需要在子类中重写。");		return 0;	}}

2)创建继承自 Figure 类的 Rectangle 子类,该类调用父类的构造方法,并且重写父类中的 area() 方法。代码如下:

public class Rectangle extends Figure{	Rectangle(double d1, double d2){		super(d1, d2);	}	double area(){		System.out.println("长方形的面积:");		return super.dim1 * super.dim2;	}}

3)创建继承自 Figure 类的 Triangle 子类,该类与 Rectangle 相似。代码如下:

public class Triangle extends Figure{	Triangle(double d1, double d2){		super(d1, d2);	}	double area(){		System.out.println("三角形的面积:");		return super.dim1 * super.dim2 / 2;	}}

4)创建 Test 测试类,在该类的 main() 方法中首先声明 Figure 类的变量 figure,然后分别为 figure 变量指定不同的对象,并调用这些对象的 area() 方法。代码如下:

public class Test {	public static void main(String[] args) 	{		Figure figure;   //声明Figure类的变量		figure = new Rectangle(8,9);		System.out.println(figure.area());		System.out.println("=====================");		figure = new Triangle(6,8);		System.out.println(figure.area());		System.out.println("=====================");		figure = new Figure(10,10);		System.out.println(figure.area());	}}

 

转载地址:http://fglq.baihongyu.com/

你可能感兴趣的文章
MySQL 中开启二进制日志(Binlog)
查看>>
MySQL 中文问题
查看>>
MySQL 中日志的面试题总结
查看>>
mysql 中的all,5分钟了解MySQL5.7中union all用法的黑科技
查看>>
Mysql 中的日期时间字符串查询
查看>>
MySQL 中锁的面试题总结
查看>>
MySQL 中随机抽样:order by rand limit 的替代方案
查看>>
MySQL 为什么需要两阶段提交?
查看>>
mysql 为某个字段的值加前缀、去掉前缀
查看>>
mysql 主从
查看>>
mysql 主从 lock_mysql 主从同步权限mysql 行锁的实现
查看>>
mysql 主从互备份_mysql互为主从实战设置详解及自动化备份(Centos7.2)
查看>>
mysql 主从关系切换
查看>>
mysql 主键重复则覆盖_数据库主键不能重复
查看>>
Mysql 优化 or
查看>>
mysql 优化器 key_mysql – 选择*和查询优化器
查看>>
MySQL 优化:Explain 执行计划详解
查看>>
Mysql 会导致锁表的语法
查看>>
mysql 使用sql文件恢复数据库
查看>>
mysql 修改默认字符集为utf8
查看>>