java多态

本文详细介绍了Java编程中的多态性概念,包括如何通过继承实现多态,以及多态的前提条件。动态绑定的概念被阐述,说明了在父类和子类存在同名方法时,调用的是子类的方法。此外,还讨论了对象转换的两种形式:隐式转换和显示转换,并介绍了`instanceof`操作符在类型检查中的应用。最后,通过示例代码展示了多态和类型转换的实际运用。
摘要由CSDN通过智能技术生成

1.多态的概念

如果有几个相似而不完全相同的对象,有时人们要求在向他们发出同一个消息时,他们的反应各不相同,分别执行不同的操作。这种情况就是多态现象。例如甲和乙都是学生,但如果响起铃声两人并不会进入同一间教室。由继承而产生的相关的不同的类,其对象对同一消息会作出不同的响应。多态性是面向对象程序设计的一个重要特征,能增加程序的灵活性。

2.多态的前提

多态的前提是存在继承关系

多态意味着父类型的变量可以引用子类型的对象。

//GeometricObject是Circle和Rectangle的父类
public class PolymorphismDemo {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		displayObject(new Circle(1,"red",false));
		displayObject(new Rectangle(1,1,"black",true));
	}
	
	public static void displayObject(GeometricObject object)
	{
		System.out.println("Created on "+object.getDateCreated()+
				" Color is "+object.getColor());
	}

}

3.动态绑定

方法可以在父类中定义在子类中重写,当父类和子类中都有同名的方法时,创建的对象会调用哪一个方法呢?

Object o = new sonOfObject();

此时会调用的是子类里的方法,因为o的声明类型是Object,但是o实际引用的是子类。这称为动态绑定。

下面为实例演示


public class DynamicBindingDemo {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		m(new GraduateStudent());
		m(new Student());
		m(new Person());
		m(new Object());
	}
	public static void m(Object x)
	{
		System.out.println(x.toString());
	}
}

class GraduateStudent extends Student
{	
}

class Student extends Person
{
	@Override
	public String toString()
	{
		return "Student";
	}
}

class Person extends Object
{
	@Override
	public String toString()
	{
		return "Person";
	}
}

匹配方法的签名和绑定方法的实现是两个不同的问题。引用变量的声明类型决定了编译时匹配哪个方法。一个方法可能在沿着继承链的多个类中实现。

4.对象转换

(1)隐式转换

将对象new Student()赋值给一个Object类型的参数。

        Object o =  new Student();

由于object是student的父类,student的实例也是object的实例,所以语句合法,此为隐式转换。

总是可以将一个子类的实例转换为一个父类的变量,此称为向上转换。

(2)显示转换

        Student b = (Student)o;

为使转换成功,必须确保要转换的对象是子类的一个实例。这可以利用instanceof来实现

5.instanceof操作符

instanceof的作用是测试左边的对象是否为右边类或子类的实例(确保在继承树上)

void someMethod(Object myObject)
{
    if(myObject instanceof Circle){
        System.out.println("Yes");
    }
}

演示多态和类型转换

public class CastingDemo {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Object object1 = new Circle(1);
		Object object2 = new Rectangle(1,1);
		displayObject(object1);
		displayObject(object2);
	}
	public static void displayObject(Object object)
	{
		if(object instanceof Circle) {
			System.out.println("The circle area is "+
		((Circle)object).getArea());
			System.out.println("The circle diameter is "+
		((Circle)object).getDiameter());
		}else if(object instanceof Rectangle)
		{
			System.out.println("The Rectangle area is "+
		((Rectangle)object).getArea());
		}
	}
}

注意:对象成员访问操作符(.)优先于类型转换操作符,所以要套一层括号。

((Circle)object).getArea();

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值