Java上转型对象

定义

如果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()方法, 实际执行的是子类重写的方法。

总结

由上述运行结果可得,上转型对象不能调用子类新增的方法,这样说明上转型对象是子类对象的简化,它不关心子类的新增功能,只关心子类的继承和重写功能。在某些时候,这种做法使得程序很清晰,降低耦合度,防止错误调用方法导致内存泄露等其它问题,具有非常大的意义,尤其在继承接口这种实现方法,我们只需具体实现这个接口里所有方法,而无须新定义多余的方法,这样在调用接口的时候就可以大大降低不安全的访问(需要什么,就只能访问什么)。
此外,这样使用父类引用指向子类对象的方式,十分契合多态的思想,一个父类声明多个方法(可能方法中什么都不写)后使用上转型对象实例化,即可实现这个方法的多种实现形式。

如有不正,欢迎批评指出

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值