久染

导航

Java day6【第十六章】多态性

【第十六章】多态性

 一.多态性简介

    多态性是面向对象中的第三个主要特征,多态性是在继承性的基础之上扩展出来的概念

    可以实现父子类的相互转换处理

   1.多态性的基本概念:

  在JAVA之中,多态性有俩种实现模式:

  (1)方法多态性:

    方法的重载:同一个方法的名称可以根据传入的参数类型或个数的不同,实现不同功能的执行

class chongzai{
	public void print(){
		System.out.println("www.mldn.con");
	}
	public void print(String str){
		System.out.println(str);
	}
}

 方法的覆写:同一个方法可能根据子类使用的不同来实现不同的功能。

class Message{
	public void print(){
		System.out.println("www.mldn.con");
	}
}
class DateMessage extends Message{
	public void print(){
		System.out.println("Oracle数据库连接信息。。");
	}
}
class NetworkMessage extends Message{
	public void print(){
		System.out.println("网络连接数据信息。。");
	}
}

  

 (2)对象多态性

  父子实例之间的转换处理,他有俩种模式:

    对象向上转型:父类 父类实例 = 子类实例;这种模式是自动完成转换

    对象向下转型:子类 子类实例= (子类)父类实例;强制完成转换

  从实际的转型处理来讲,大部分情况下考虑最多的一定是对象的向上转型(90%),对于对象的向下转型往往都在使用子类特殊功能的时候(3%),还有一些时候是不会考虑转型的(7%)

  上转型对象会失去原对象的一些属性和方法。(向上转型对象相当于子类对象的一个简化版)。

  比如动物是父类,老虎是子类,那么当我们说老虎是动物的时候,老虎就失去了老虎本来拥有的一些特征,向上更宽的范围定义。

 二.对象向上转型(接受或返回参数的统一性):

  对象转型的处理属于多态性,而这一特性必须在继承的基础上实现。


范例:观察一个简单代码:

class Message{
	public void print(){
		System.out.println("www.mldn.con");
	}
}
class DateMessage extends Message{
	public void print(){
		System.out.println("Oracle数据库连接信息。。");
	}
}
public class tsy
{
	public static void main(String[] args) 
	{
		DateMessage msg = new DateMessage();
                msg.print();
	}
}    

  本程序是一个最简单的方法覆写操作实现,整体的程序之中由于实例化的是子类对象,并且子类对象覆写了父类中的print方法,所以调用的是被覆写的方法。

范例:观察向上转型:

class Message{
	public void print(){
		System.out.println("www.mldn.con");
	}
}
class DateMessage extends Message{
	public void print(){
		System.out.println("Oracle数据库连接信息。。");
	}
}
public class tsy
{
	public static void main(String[] args) 
	{
		Message msg = new DateMessage();         //向上转型
                msg.print();
	}
}    

  那么这时候就要进行思考了,向上转型到底有什么用呢?

观察下面代码:

class Message
{
	public void print(){
		System.out.println("连接信息格式化中..");
	}
}

class DateMessage extends Message
{
	@Override
	public void print(){
		System.out.println("数据库连接信息格式化中..");
	}
}

class WebServerMessage extends Message
{
	@Override
	public void print(){
		System.out.println("Web连接信息格式化中..");
	}
}
 public class tsy
{
	public static void main(String[] args) 
	{
		fun(new DateMessage());
		fun(new WebServerMessage());
	}
	public static void fun(Message mes){
		mes.print();
	}
}

  可以看出,向上转型可以对传入的参数进行统一的设计,但是我们这里为什么不适用重载的方法来实现这个目的呢?

  在程序类设计的时候,除了满足于当前的要求之外,还要做出可维护性的设计,如果随着项目的发展,Message产生了许多的子类,每当扩充一个Message子类之后,就要追加一个fun()的方法重载,这样就对程序的维护性造成很大影响。

三.对象向下转型:

  向下转型主要特点在于需要使用到一些子类自己特殊的定义处理:

 

 

 

 

范例:实现向下转型:

     向下描述的是子类的特殊定义,但是向下转型不一定是安全的。因为在进行向下转型之前,一定要发生向上转型。

 

四. instanceof关键字

  通过上面的分析,我们可以发现,向下转型是一件具有安全隐患的操作 ,为了保证向下转型的正确性,我们往往需要在转型之前进行判断某个实例是否是某个类的对象,这个就需要通过instaceof语法来实现:

  对象 instanceof 类

  该判断将返回一个bool类型。

范例: 

class Person
{
	public void print(){
		System.out.println("我是人");
	}
}
class SuperMan extends Person
{
	public void print(){
		System.out.println("我是超人");
	}
}

 public class tsy
{
	public static void main(String[] args) 
	{
		Person per = new Person();
		System.out.println(per instanceof Person);				//per是Person类,所以返回true
		System.out.println(per instanceof SuperMan);			//per不是SuperMan类,所以返回false
	}
}

  

posted on 2019-10-18 09:27  久染  阅读(192)  评论(0)    收藏  举报