多态性三种表现形式:
1. 类多态(通过继承实现)
2. 方法多态(方法重写,方法重载: 通过参数列表个数,类型不同来区分)
3. 动态连接(定义接口,然后声明上转型对象来实现)
上转型对象是将子类的对象赋值给父类的引用,形如: SuperClass sup = new SubClass();
是类多态性的一种表现形式(动态连接).
上转型对象不能使用子类新增成员(包括成员变量,成员方法),只能使用子类重写父类的方法,被子类隐藏的父类变量;子类未重写的父类方法,未被隐藏的父类成员变量.
我的误区:原来一直认为上转型对象无论是成员变量,还是成员方法都是优先访问子类的.如果子类覆盖了父类的成员变量,则上转型对象一定是访问子类覆盖父类的成员变量(子类中的成员变量),而不是访问父类中的成员变量.
因为JavaBean的广泛应用,平时在做Java程序的时候,因为一个读写权限的问题,常常不会对变量直接操作,而是通过成员变量的get,set方法间接操作成员变量.所以很自然错误地理解上转型对象操作变量与调用方法是类似的.
举例:
/*
@author jarg
@TODO 上转型对象测试
*/
class SuperClass
{
String str = "super";
void display()
{
System.out.println("super class: " + this.toString());
}
}
class SubClass extends SuperClass
{
String str = "sub";
void display()
{
System.out.println("sub class: " + this.toString());
}
}
public class Client
{
public static void main(String[] args)
{
SuperClass sup = new SubClass();
System.out.println("sup.str=" + sup.str);
sup.display();
}
}
如上代码中,sup.str访问的是父类的变量,输出sup.str=super;而sup.display()输出subclass: SubClass@1fb8ee3.
可见,不管子类有没有覆盖父类的成员变量,SuperClass的引用都是访问父类的成员变量str=super.而被调用的display()方法显然是子类中的方法.
个人认为这跟数据在存储方法的差别导致了这种现象,由于本人水平有限,分析暂时到此.
分析不对的地方,大家给指正,谢谢.