Java对象的多态性

Posted tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java对象的多态性相关的知识,希望对你有一定的参考价值。

多态性在面向对象中主要有两种体现:

<1>方法的重载与覆写

<2>对象的多态性

  对象的多态性:向上转型:子类对象-->父类对象,向上转型会自动完成

         向下转型:父类对象-->子类对象,向下转型时,必须明确地指明转型的子类类型

对象的向上转型

虽然使用的父类对象调用fun1方法,但是实际上调用的方法是被子类覆写过的方法,也就是说,如果对象发生了向上转型关系后,所调用的方法一定是被子类覆写过的方法。

但是父类的a无法调用b类中的fun3方法,因为这个方法只在子类中定义,而没有在父类中定义。

//=================================================
// File Name       :	ploy_up_demo
//------------------------------------------------------------------------------
// Author          :	Common

// 类名:C_1
// 属性:
// 方法:
class C_1{												// 定义接口C_1
	public void fun1(){							//定义fun1()方法
		System.out.println("C_1--->public void fun1");
	}
	
	public void fun2(){							//定义fun2()方法
		this.fun1();
	}
}

//类名:D_1
//属性:
//方法:
class D_1 extends C_1{												//子类D_1继承父类C_1
	public void fun1(){
		System.out.println("D_1--->public void fun1");	//覆写父类中的fun1()方法
	}
	
	public void fun3(){													
		System.out.println("D_1--->public void fun3");	//子类自己定义方法
	}
}


//主类
//Function        : 	对象的多态性,对象向上转型
public class ploy_up_demo {

	public static void main(String[] args) {
		// TODO 自动生成的方法存根
		D_1 b = new D_1();			//定义子类的实例化对象
		C_1 a = b;						//声明一个父类,发生向上转型的关系,子类赋值给父类
		a.fun1();							//此方法被子类覆写过,虽然a是父类,但是调用的是子类的fun1()方法
	}

}

 

对象的向下转型

在子类中调用了父类中的fun2方法,fun2方法要调用fun1方法,但是此时fun1方法已经被子类覆写过了,所以调用fun2方法的时候还是调用被子类覆写过的方法

在进行对象的向下转型之前,必须首先发生对象的向上转型,否则将出现对象转换异常

//=================================================
// File Name       :	ploy_up_demo
//------------------------------------------------------------------------------
// Author          :	Common

// 类名:C_1
// 属性:
// 方法:
class C_1{												// 定义接口C_1
	public void fun1(){							//定义fun1()方法
		System.out.println("C_1--->public void fun1");
	}
	
	public void fun2(){							//定义fun2()方法
		this.fun1();
	}
}

//类名:D_1
//属性:
//方法:
class D_1 extends C_1{												//子类D_1继承父类C_1
	public void fun1(){
		System.out.println("D_1--->public void fun1");	//覆写父类中的fun1()方法
	}
	
	public void fun3(){													
		System.out.println("D_1--->public void fun3");	//子类自己定义方法
	}
}


//主类
//Function        : 	对象的多态性,对象向上转型
public class ploy_up_demo {

	public static void main(String[] args) {
		// TODO 自动生成的方法存根
//		D_1 b = new D_1();			//定义子类的实例化对象
//		C_1 a = b;						//声明一个父类,发生向上转型的关系,子类赋值给父类
//		a.fun1();							//此方法被子类覆写过,虽然a是父类,但是调用的是子类的fun1()方法
		
		C_1 c = new D_1();			//声明一个父类,发生了向上转型,子类赋值给父类
		D_1 d = (D_1)c;				//声明的父类强制转换成子类,发生了向下转型关系
		d.fun1();
		d.fun2();
		d.fun3();
	}

}

 

以上是关于Java对象的多态性的主要内容,如果未能解决你的问题,请参考以下文章

java中封装,继承,多态,接口学习总结

Java 多态

Java面向对象三大特征之继承和多态

Java面向对象之多态

什么是多态性,C++中是如何实现多态的

Java代码执行顺序及多态体现