定义
如果A类继承自B类,即B为A的父类,那么当使用A的构造方法实例化一个B的对象时,所产生的b对象即为上转型对象。
例:
class B {
}
public class A extends B {
public static void main(String[] args) {
B b = new A();
}
}
特点
所谓上转,即范围小的类(子类)转为范围大的类(父类),所实例化的对象类型依然是父类,不过使用的是①父类构造方法 + ②子类构造方法所实例化的。此对象具有父类的属性与方法(非private声明的)以及子类重写(override)后的属性与方法(访问权限修饰符级别不能高于父类的),显然,此对象不能调用子类新增的方法。
例:
public class A extends B{
A(){
System.out.println("子类构造方法");
}
public void Aprint() {
System.out.println("子类新增方法");
}
public void Bprint() {
System.out.println("子类覆盖父类方法");
}
public static void main(String[] args) {
B b = new A();
b.Bprint();//编译正确
b.Aprint();//编译错误
}
}
class B {
B(){
s = 1;
System.out.println("父类构造方法");
}
public void Bprint() {
System.out.println("子类新增方法");
}
}
输出结果:
父类构造方法
子类构造方法
子类覆盖父类方法
应用
public class Person {
public void mine() {
System.out.println("我是一个人");
}
public static void main(String[] args) {
Person per1 = new Chinese();
Person per2 = new Korean();
Person per3 = new Thai();
Person per4 = new American();
per1.mine();
per2.mine();
per3.mine();
per4.mine();
}
}
class Chinese extends Person {
public void mine() {
System.out.println("我是中国人");
}
}
class Korean extends Person {
public void mine() {
System.out.println("我是韩国人");
}
}
class Thai extends Person {
public void mine() {
System.out.println("我是泰国人");
}
}
class American extends Person {
public void mine() {
System.out.println("我是美国人");
}
}
输出结果:
我是中国人
我是韩国人
我是泰国人
我是美国人
介绍:虚拟方法调用(多态情况下) 子类中定义了与父类同名同参数的方法,在多态情况下,将此时父类的方法称为虚拟方法,父类根据赋给它的不同子类对象,动态调用属于子类的该方法。这样的方法调用在编译期是无法确定的。
前提: Person类中定义了mine()方法,各个子类重写了mine()。
执行: 多态的情况下,调用对象的mine()方法, 实际执行的是子类重写的方法。
总结
由上述运行结果可得,上转型对象不能调用子类新增的方法,这样说明上转型对象是子类对象的简化,它不关心子类的新增功能,只关心子类的继承和重写功能。在某些时候,这种做法使得程序很清晰,降低耦合度,防止错误调用方法导致内存泄露等其它问题,具有非常大的意义,尤其在继承接口这种实现方法,我们只需具体实现这个接口里所有方法,而无须新定义多余的方法,这样在调用接口的时候就可以大大降低不安全的访问(需要什么,就只能访问什么)。
此外,这样使用父类引用指向子类对象的方式,十分契合多态的思想,一个父类声明多个方法(可能方法中什么都不写)后使用上转型对象实例化,即可实现这个方法的多种实现形式。
如有不正,欢迎批评指出。