深入理解Java中多态的含义

1.什么是多态

     多态从字面上理解为,一类事物在不同的环境下以不同的形态存在并发挥着不同的功能。就好比是一个人他从事多项不同的工作,那么他在不同的工作中所承担着的作用和具体的职位是不同的,他具体是什么形态取决于他当前正在干的工作。

      在 Java 及其他的编程语言中,多态是一种很重要的特性。它是面向对象编程 4 种特性(封装、继承、多态、抽象)其中一种。体现了面向对象编程同面向过程编程的不同。


2.多态的产生

      从本质上来讲,多态起源于继承,可以说没有继承就没有多态这一机制。所以人们常提到面向对象 往往会说封装继承多态。说明了继承是多态的先决条件。在 Java 中子类的引用可以赋给父类的引用,并且在任何情况下都是合法的。那么就有一个问题,一个基类如果说不只有一个派生类,那就说明了一个基类的对象其实可以表征的形态是多种多样的。具体有多少种取决于你派生类的个数。


3.多态的作用

       我们提到多态,就不得不提到一个很”神奇”的东西,叫做”方法的覆写”.它不同于函数的重载,而是要求在子类中可以覆写基类的方法但是要是除了函数体不一样其它的都得一模一样,如果只是名字一样,那就不叫覆写了。

       好了,那么我们为什么要提到这个机制呢?前面讲过我们可以把基类的对象当成子类对象来使用,那如果我们用调用基类和子类所共有的一个方法,那么具体 会 调 用 那 个 方 法 呢 ? 我 们来看个例子

      我们创建了 4 个继承于 FactualyMember 的对象 member1 、member2 、member3、member4.它们分别是 Teacher、official、Experimenter、Teacher 类型的,我们将它们都加入到创建好的一个有关于 FactualyMember 的链表中,前面提到了我们可以将子类的对象赋给父类的对象使用,所以这样做是合法的。紧接着我们循环打印这个链表,请注意每次都是在打印一个 FactualyMember 对象(即调 用 FactualyMember  对 象 的 toString  方 法 )那 么 结 果 是 什 么 呢 :

   可以看到打印出了信息看上去似乎没有什么神奇的地方那么我们去看下

FactualyMember 类 中 的 toString 方法 :

    有没有发现很奇怪的地方?没错,似乎 FactualyMember 类中的 toString 方法返回的字符串和我们打印出来的结果不太一样,说明程序在运行过程中并没有运行这个方法。

我 们 不 妨 去 看 下 Teacher 类 中 的 方 法 :

     仔细对比会发现刚好和结果相一致,看到这我觉得我已经将多态的好处展现出来了那就是:你在操作一个多态的对象的时候,如果调用的是覆写的方法那么 Java 虚拟机就会自己去判断这个多态是真正属于哪个子类的,然后去调用哪个子类的该方法,所以程序打印那个 member 对象实际上是打印了一个 Teacher 对象。

附录:

package factuall;

public class FacultyMember {

	private String identification;
	private String name;
	private String contactTelephone;
	public FacultyMember(String identification, String name, String contactTelephone) {
		super();
		this.identification = identification;
		this.name = name;
		this.contactTelephone = contactTelephone;
	}
	public String getIdentification() {
		return identification;
	}
	public String getName() {
		return name;
	}
	public String getContactTelephone() {
		return contactTelephone;
	}
	public String toString() {
		return "name: "+name+" id:"+identification+" phone:"+contactTelephone;
	}
	public boolean equals(Object o) {
		if(o instanceof FacultyMember)
			return false;
		else {
			FacultyMember a = (FacultyMember)o;
			return a.name==this.name & a.identification==this.identification
					&a.contactTelephone==this.contactTelephone;
		}
		
	}
	
}
package factuall;

public class Experimenter extends FacultyMember {

	private String degree;
	public Experimenter(String identification, String name, String contactTelephone,String degree) {
		super(identification, name, contactTelephone);
		this.degree = degree;
	}
	public String getDegree() {
		return degree;
	}
	public String toString() {
		return " Experiment: "+super.toString()+" degree: "+degree;
	}
	
	

}
package factuall;

public class official extends FacultyMember {
	private String jobPostion;

	public official(String identification, String name, String contactTelephone,String jobPostion) {
		super(identification, name, contactTelephone);
		this.jobPostion = jobPostion;
		// TODO Auto-generated constructor stub
	}

	public String getJobPostion() {
		return jobPostion;
	}
	public String toString() {
		return "Official: "+super.toString()+" jobpostion: "+jobPostion;
	}
	

}
package factuall;

public class Teacher extends FacultyMember {
	private String title;
	public Teacher(String identification, String name, String contactTelephone,String title) {
		super(identification, name, contactTelephone);
		this.title = title;
	}
	public String getTitle() {
		return this.title;
	}
	public String toString() {
		return "Teacher: "+super.toString()+" title: "+title;
	}

	

}
package factuall;

import java.util.ArrayList;

public class Main {
	 
	private static ArrayList<FacultyMember> member = new ArrayList<FacultyMember>();

	public static void main(String[] args) {
		Teacher member1 = new Teacher("1001","lihua","181*****","yuwen");
		official member2 = new official("1002","lihua","182*****","mate");
		Experimenter member3 = new Experimenter("1003","lihua","182*****","10000");
		Teacher member4 = new Teacher("1005","lihua","181*****","shuxue");
			member.add(member1);
			member.add(member2);
			member.add(member3);
			member.add(member4);
		for(FacultyMember mem:member) {
			System.out.println(mem);
		}
		

	}

}

 

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值