文档章节

从头认识java-1.6 多态

raylee2015
 raylee2015
发布于 2015/10/21 08:10
字数 889
阅读 44
收藏 0

#程序员薪资揭榜#你做程序员几年了?月薪多少?发量还在么?>>>

这一章节我们来简单讨论一些多态,java三大特性的最后一个。

1.概念

多态(Polymorphism)按字面的意思就是“多种状态”。在面向对象语言中,接口的多种不同的实现方式即为多态。引用Charlie Calverts对多态的描述——多态性是允许你将父对象设置成为和一个或更多的他的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作(摘自“Delphi4 编程技术内幕”)。

说白了,就是父类引用子类对象。

(1)调用的时候使用类型的多种状态

我们下面引入一个接口类Person

package com.ray.ch01;

public abstract class Person {
	public abstract void eat();

	public abstract void sleep();

}


下面的Boxer和Singer都是继承Person这个父类。


package com.ray.ch01;

public class Boxer extend Person {

	public void fight() {

	}

	@Override
	public void eat() {
		System.out.println("boxer is eatting");
	}

	@Override
	public void sleep() {
		System.out.println("boxer is sleeping");
	}

}

package com.ray.ch01;

public class Singer extend Person {

	public void sing() {

	}

	@Override
	public void eat() {
		System.out.println("singer is eatting");
	}

	@Override
	public void sleep() {
		System.out.println("singer is sleeping");
	}

}


测试类Test:
package com.ray.ch01;

public class Test {
	public static void main(String[] args) {
		Person boxer = new Boxer();
		boxer.eat();
		boxer.sleep();
		Person singer = new Singer();
		singer.eat();
		singer.sleep();
	}
}

测试输出:

boxer is eatting
boxer is sleeping
singer is eatting
singer is sleeping

从上面的代码可以看出,boxer和singer对象都是Person类,他们都不知道实际需要调用那个版本的eat和sleep方法,但是为什么最后的结果是我们需要的呢?下面我们会给出结论。

(2)参数使用类型的多种状态

我们继续沿用Person、Boxer和Singer这三个类,但是我们修改一下测试类Test

package com.ray.ch01;

public class Test {
	
	private void test(Person person) {
		person.eat();
		person.sleep();
	}
	
	public static void main(String[] args) {
		Test test = new Test();
		Person boxer = new Boxer();
		test.test(boxer);
		Person singer = new Singer();
		test.test(singer);
	}
}

上面的代码,我们把Person作为参数传到test里面去,然后person调用各自的方法。

同样的问题,在参数传进去之前,person根本就不知道指向那个实现版本。

测试输出:

boxer is eatting
boxer is sleeping
singer is eatting
singer is sleeping


(3)返回值使用多态。

我们再一次使用Person、Boxer和Singer这三个类,然后修改一下测试类Test

package com.ray.ch01;

public class Test {

	private Person test(Person person) {
		return person;
	}

	public static void main(String[] args) {
		Test test = new Test();
		Person boxer = new Boxer();
		test.test(boxer).eat();
		test.test(boxer).sleep();
		Person singer = new Singer();
		test.test(singer).eat();
		test.test(singer).sleep();
	}
}

测试输出:

boxer is eatting
boxer is sleeping
singer is eatting
singer is sleeping


为了演示给大家看,我把测试类的代码绕了一下,通过一个方法,返回Person类,然后调用各自的方法。


那么,java是怎样做到呢?在这里我简单说一下,然后在后面的章节我们会详细展开。

其实eat和sleep都是泛化之后的方法,他们都面对调用哪个实际版本的问题。

对于一般非oop语言,他们会使用前期绑定的方法,也就是一开始就已经绑定方法的内存地址。

但是java它是使用后期绑定(运行时绑定),它通过一段特殊的代码,计算执行方法的内存地址,当然这段代码在编译器里面,我们是看不见的,在运行的时候绑定计算出来的内存地址。


总结:这一章节我们简单讨论了多态。


这一章节就到这里,谢谢。

-----------------------------------

目录

版权声明:本文为博主原创文章,未经博主允许不得转载。

本文转载自:http://blog.csdn.net/raylee2007/article/details/49247821

raylee2015
粉丝 6
博文 265
码字总数 44224
作品 0
江门
私信 提问
加载中

评论(0)

Java编程思想读书笔记(一)【对象导论】

<code>2018年1月7日15:45:58</code> 前言 作为学习Java语言的经典之作《Java编程思想》,常常被人提起。虽然这本书出版十年有余,但是内容还是很给力的。很多人说这本书不是很适合初学者,我...

osc_dh0xu7zu
2018/01/09
2
0
Java2019年第二学期课程总结

#期末课程总结 ##一、Java基础程序设计 1、认识Java ###2、简单的Java程序 3、运算符 4、程序的结构 二、Java面对对象程序设计 1、类 2、封装 3、继承 4、多态 this关键字 static关键字 main...

osc_27xxmyzv
2019/12/12
2
0
Java自学路线图之Java进阶自学

Java自学路线图的第二阶段是Java语言进阶自学,在自学了第一阶段的Java基础自学后,大家对Java语言编程有了初步的了解和认识,建议在第一部分自学后整理一下自己的自学思路,思考自己在自学J...

osc_6b6pwh7r
03/15
26
0
Java编程思想(第4版)下载 򐲍

<h2>下载地址: <a style="color: blue;" href="http://www.gqylpy.com/di/13">http://www.gqylpy.com/di/13</a></h2> 《Java编程思想(第4版)》PDF高清完整版-下载 内容简介 编辑 本书赢得了全......

osc_h0wb1wlt
2019/08/18
2
0
2019秋大二第二周java学习总结

本周java学习总结:1认识java了的历史,知道了java程序的运行机制和java虚拟机,以及JDK的安装与搭配,了解到classpath属性的作用。JVM(Java Virtual Machine):java虚拟机,用于保证java的跨...

osc_zh10j2cp
2019/09/07
2
0

没有更多内容

加载失败,请刷新页面

加载更多

OSChina 周五乱弹 —— 头发和不要头发,你总要选一个

Osc乱弹歌单(2020)请戳(这里) 【今日歌曲】 @薛定谔的兄弟 :分享洛神有语创建的歌单「我喜欢的音乐」: 《雾 缀じた街 ふたつのかげ》- Porkkana 手机党少年们想听歌,请使劲儿戳(这里)...

小小编辑
今天
41
0
一道 算法题 引发的 ‘xx现场’

请 熟悉的语言 去 验证 在输入框中输入的是否是一个正确的网址 初次读题萌新有点 不知所措的样子一查 MDN 吓一跳 ----- 一个不怎么熟悉的方法跳出眼边URL() 构造函数返回一个新创建的 ...

酒窝yun过去了
今天
19
0
如何检查jQuery中是否已选中复选框? - How to check whether a checkbox is checked in jQuery?

问题: I need to check the checked property of a checkbox and perform an action based on the checked property using jQuery. 我需要检查复选框的checked属性,并使用jQuery根据check......

技术盛宴
今天
12
0
mongoose 使用

http://www.mongoosejs.net/ 编写MongoDB验证,转换和业务逻辑是非常麻烦的. 所以Mongoose应运而生了. const mongoose = require('mongoose');mongoose.connect('mongodb://localhost/te......

东东笔记
今天
30
0
微服务

什么是微服务? 使用一套小服务来开发单个应用的方式,每个服务运行在独立的进程里,一般采用轻量级的通讯机制互联,并且他们可以通过自动化的方式部署。 微服务的特征 单一职责 轻量级通信 ...

鸿FW
今天
23
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部