博客
关于我
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 高可用性之keepalived+mysql双主
查看>>
mysql-connector-java各种版本下载地址
查看>>
mysql-group_concat
查看>>
MySQL-【4】基本操作
查看>>
Mysql-丢失更新
查看>>
Mysql-事务阻塞
查看>>
Mysql-存储引擎
查看>>
MySQL-数据目录
查看>>
MySQL-数据页的结构
查看>>
MySQL-架构篇
查看>>
Mysql-触发器及创建触发器失败原因
查看>>
MySQL-连接
查看>>
mysql5.5和5.6版本间的坑
查看>>
mysql5.5最简安装教程
查看>>
mysql5.6 TIME,DATETIME,TIMESTAMP
查看>>
mysql5.6.21重置数据库的root密码
查看>>
Mysql5.6主从复制-基于binlog
查看>>
MySQL5.6忘记root密码(win平台)
查看>>
MySQL5.6的Linux安装shell脚本之二进制安装(一)
查看>>
MySQL5.6的zip包安装教程
查看>>