父子对象之间的转换分为了向上转型向下转型,它们区别如下:

  • 向上转型 : 通过子类对象(小范围)实例化父类对象(大范围),这种属于自动转换
  • 向下转型 : 通过父类对象(大范围)实例化子类对象(小范围),这种属于强制转换

1. 向上转型

示例1-向上转型

class A {
public void print() {
System.out.println("A:print");
}
} class B extends A {
public void print() {
System.out.println("B:print");
}
} public class Test{
public static void main(String args[])
{
A a = new B(); //通过子类去实例化父类
a.print();
}
}

运行打印:

如上图所示,可以看到打印的是class B的print,这是因为我们通过子类B去实例化的,所以父类A的print方法已经被子类B的print方法覆盖了.从而打印classB的print.

类似于C++的virtual虚函数。

这样做的意义在于:

  • 当我们需要多个同父的对象调用某个方法时,通过向上转换后,则可以确定参数的统一.方便程序设计(参考下面示例)

示例2-向上转型的作用分析

class A {
public void print() {
System.out.println("A:print");
}
} class B extends A {
public void print() {
System.out.println("B:print");
}
} class C extends B {
public void print() {
System.out.println("C:print");
}
} public class Test{
public static void func(A a)
{
a.print();
} public static void main(String args[])
{
func(new B()); //等价于 A a =new B();
func(new C()); //等价于 C c =new C();
}
}

运行打印:

PS:向上转型时,父类只能调用父类方法或者子类覆写后的方法,而子类中的单独方法则是无法调用的.

2. 向下转型

在java中,向下转型则是为了,通过父类强制转换为子类,从而来调用子类独有的方法(向下转型,在工程中很少用到).

为了保证向下转型的顺利完成,在java中提供了一个关键字:instanceof,通过instanceof可以判断某对象是否是某类的实例,如果是则返回true,否则为false,instanceof使用如下:

A a = new B();                 //向上转型 (B类是A的子类)

a instanceof A;                //返回true.
a instanceof B; //返回true
a instanceof C; //返回false

接下来,我们便来分析向下转型的意义.

示例-向下转型的作用分析

class A {
public void print() {
System.out.println("A:print");
}
} class B extends A {
public void print() {
System.out.println("B:print");
}
public void funcB(){
System.out.println("funcB");
}
} class C extends A {
public void print() {
System.out.println("C:print");
}
public void funcC(){
System.out.println("funcC");
}
} public class Test{
public static void func(A a)
{
a.print();
if(a instanceof B)
{
B b = (B)a; //向下转型,通过父类实例化子类
b.funcB(); //调用B类独有的方法
}
else if(a instanceof C)
{
C c = (C)a; //向下转型,通过父类实例化子类
c.funcC(); //调用C类独有的方法
}
} public static void main(String args[])
{
func(new A());
func(new B());
func(new C());
}
}

运行打印:

从上面打印可以看到,我们成功通过向下转型来调用B类和C类独有的方法.

下章学习: 9.JAVA-抽象类定义

最新文章

  1. 关于json序列化循环引用导致出错
  2. iOS开发masonry的一些使用简介
  3. VNC server grey screen under ubuntu 14.04
  4. 华东交通大学2016年ACM“双基”程序设计竞赛 1008
  5. 打印机问题win7 和xp
  6. 控制文本和外观------Style Binding(Style属性绑定)
  7. Android 调用系统的邮箱app发送邮件
  8. web前端常用小函数汇总
  9. Python资源汇集
  10. NET中级课--设计模式1
  11. Python -堆的实现
  12. SourceTree 03 - 跳过账号登录直接进入主界面
  13. k8s简单的来部署一下tomcat,并测试自愈功能
  14. 利用this属性实现点击按钮变色.选中效果
  15. RabbitMQ入门-竞争消费者模式
  16. PHP is_numeric 检测变量是否为数字或数字字符串
  17. SQLYog执行SQL脚本提示:错误代码: 1067 - Invalid default value for '数据库表'查询:解决办法
  18. Python获取二维数组的行列数
  19. tips: javascript 参数传递含有空格怎么办?
  20. Vue图片懒加载之lazyload插件使用

热门文章

  1. windows下Python扩展问题error: Unable to find vcvarsall.bat
  2. 【翻译自mos文章】在12c中Create or Truncate Table时非常慢,等待事件为 DFS Lock Handle wait
  3. asp.net MVC 中呈现指定区域下的分部视图
  4. IIS老革命遇到的一些问题
  5. 2016/3/27 PHP中include和require的区别详解
  6. 生成 hibernate 映射文件和实体类
  7. 关于树论【LCA树上倍增算法】
  8. Linux设备模型 (2)
  9. Java Socket实战之二:多线程通信
  10. python 高阶函数二 map()和reduce()