文档章节

从头认识java-1.6 多态

raylee2015
 raylee2015
发布于 2015/10/21 08:10
字数 889
阅读 5
收藏 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
江门
私信 提问
Java面试题:面向对象,类加载器,JDBC, Spring 基础概念

为什么说Java是一门平台无关语言? 平台无关实际的含义是“一次编写到处运行”。Java 能够做到是因为它的字节码(byte code)可以运行在任何操作系统上,与底层系统无关。 2. 为什么 Java 不...

Java干货分享
前天
0
0
小谈Java Enum的多态性

Enum+多态,我没说错,不过Enum是不可以被继承的,也不可以继承自别人,只是能实现接口而已,何谈多态? 不过还是先看看“现象”吧: Java代码 public enum Fruit { APPLE, PEAR, PEACH, OR...

关西大汉弹琵琶
2015/05/30
0
0
每周10道Java面试题:面向对象, 类加载器, JDBC, Spring 基础概念

本文作者:ImportNew -唐尤华 未经许可,禁止转载! 每周10道 Java 面试题由 ImportNew 整理编译自网络,欢迎投稿您面试中遇到过的疑难问题。 1. 为什么说Java是一门平台无关语言? 平台无关...

ImportNew
12/13
0
0
Java读带有BOM的UTF-8文件乱码原因及解决方法

最近在处理文件时发现了同样类型的文件使用的编码可能是不同的。所以想将文件的格式统一一下(因为UTF-8的通用性,决定往UTF-8统一),遇见的第一个问题是:如何查看现有文件的编码方式。 上网...

张志浩
2012/11/06
0
0
最近比较闲,想再修改下PHP

以前刚做PHP的时候,总觉得PHP语法很奇怪,就修改过一段时间,大概完成一部分,后来忙什么事就把这忘记了, 大概的做法就是,把php语法修改为类java, 1:改为强类型 如 $a = 1,修改为 int ...

擅长被美女推倒
2012/12/23
966
18

没有更多内容

加载失败,请刷新页面

加载更多

MySQL自增属性auto_increment_increment和auto_increment_offset

MySQL的系统变量或会话变量auto_increment_increment(自增步长)和auto_increment_offset(自增偏移量)控制着数据表的自增列ID。 mysql> show tables;Empty set (0.00 sec)mysql> CREATE TA......

野雪球
16分钟前
0
0
OSChina 周三乱弹 —— 有一天考拉麻麻拉肚子了

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @瘟神灬念 :分享周汇洋的单曲《Man Srae(曼斯拉之舞)》:美滋滋。。。。 手机党少年们想听歌,请使劲儿戳(这里) 我听了一下 赶紧关了, ...

小小编辑
今天
81
5
oh-my-zsh 自定义

GitHub 地址 基于 oh-my-zsh 的自定义配置,增加了一些个人常用插件与皮肤。 采用的是 git submodule 来维护,包括 oh-my-zsh,之所以这么搞,主要是手头有多台 linux 需要维护, 每台机器、...

郁也风
今天
7
0
Docker安装踩坑:E_FAIL 0x80004005的解决

参考 菜鸟教程--Windows Docker 安装 http://www.runoob.com/docker/windows-docker-install.html 官方文档-Install Docker Toolbox on Windows https://docs.docker.com/toolbox/toolbox_in......

karma123
今天
6
0
js垃圾回收机制和引起内存泄漏的操作

JS的垃圾回收机制了解吗? Js具有自动垃圾回收机制。垃圾收集器会按照固定的时间间隔周期性的执行。 JS中最常见的垃圾回收方式是标记清除。 工作原理:是当变量进入环境时,将这个变量标记为“...

Jack088
昨天
18
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部