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