栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

java多态

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

java多态

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();

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/859547.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号