对象的类型转换是我们在编程的时候常常会遇到的,java平台也是如此。比方一些基本类型的数据转型和复合数据的转换。

举例

java语言中主要分为向上转型和向下转型,怎样来了解和掌握这两者转型的关系呢?首先我们先来举个样例,相信大家看完以后就会明确了。 

        比方说我们的现实的世界中有动物、猫科动物、老虎这三样东西,它们三者都有什么样的关系呢?假设用面向对象的思维来考虑的话。老虎是子类,猫科动物是老虎的父类。老虎对象就是猫科动物的对象,在这里要特别说明的一点就是:老虎是猫科动物的一个对象,那么猫科动物所具有的特征老虎都有,(用面向对象来说就是有同样的属性和行为),这样的方法就是向上转型(通常也叫隐式转型)。

        假设是这样转型的话是没有问题的,我们人的正常思维也是正确的,编译器在编译的时候也不会报错的。可是在工作中我们常常会遇到向下转型的情况。可是这样的向下转型时候编译器往往会报错,假设说猫科动物是老虎的话。这里应该是一个否命题(至少眼下为止),在面向对象的世界里面,越是详细的东西它所具有的特征就越多。而越抽象的东西他的特性就越少,仅仅是抽象了一些共性的东西。

要确保对象向下转型的时候即编译器不会报错,又要确保详细的对象在抽象对象中也有。在这里,我们须要採用java的keyword来推断一下,instanceof,我们能够利用这个操作符来推断一个类是否实现了一个接口或者是一个类的子类。

        老虎 instanceof 猫科动物,它返回的是一个布尔值。假设返回true的话说明该对象是某个类的实例,false是反之。

代码

看一下下边的程序段:

package test;
class A {
public String f(A obj)
{
return("A");
}
}
class B extends A {
public String f(B obj)
{
return("C");
}
public String f(A obj)
{
return("D");
}
}

我们使用子类创建一个对象:

B b = new B();

然后再将这个子类的引用放到父类对象中:

A a;

a = b;

那么这个父类对象a是子类对象b的上转型对象。对象的实体由子类负责建立,实质还是子类,仅仅是损失了一些功能而已,这种得失详细例如以下:

得:上转型对象能够操作和使用子类继承或者重写的方法。 

失:上转型对象丧失了对子类新增成员变量或新增的方法的操作和使用。 

那么下边的这段測试代码的打印结果就是“D”。由于a2仅仅能有public String f(A obj) 这种方法是能够用的。

public class TestObj
{
public static void main(String args[])
{ A a1 = new A();
A a2 = new B(); //子类对象转化为父类,称为上转型,不须要强制转换。 B b = new B();
System.out.println(a2.f(b)); //“D” System.out.println(); if (a2 instanceof B) {
B b1 = (B) a2; //父类对象转化为下转型,此时须要使用强制转换,此时须要先推断要转换的这个对象(也就是a2指向的这个对象)是不是B类的实例
System.out.println(b1.f(b));//"C"
System.out.println(b1.f(a1));//"D"
}
}
}

总结

对象转型能够使父类对象的引用能够指向子类对象,给程序带来了比較好的可扩展性:我们能够在一个方法的參数里面定义父类的引用,然后实际其中传的时候传的是子类的对象,然后我们再在方法里面推断这个传过来的子类对象究竟属于哪个子类,然后再去运行这个子类里面的方法或者调用这个子类里面的成员变量,因此程序的可扩展性比单独定义好多个方法要好一些。只是这个可扩展性还没有达到最好,使用多态就能够让程序的扩展性达到极致。

java入门之——对象转型的更多相关文章

  1. Java自学-接口与继承 对象转型

    Java中的对象转型 示例 1 : 明确引用类型与对象类型的概念 首先,明确引用类型与对象类型的概念 在这个例子里,有一个对象 new ADHero(), 同时也有一个引用ad 对象是有类型的, 是A ...

  2. Java菜鸟学习笔记--面向对象篇(十八):对象转型&多态

    Polymorphism[多态] 简述: 面向对象多态性指的是:发送消息给某个对象,让该对象自行决定响应何种行为. 通过将子类对象引用赋值给超类对象引用变量来实现动态方法调用 多态的三个前提条件: 多 ...

  3. Java入门篇(六)——类和对象

    写到这里终于写到了入门篇的最后一个知识点了.类和对象是Java中经常被提到的两个词汇,实际上可以将类看作对象的载体,它定义了对象所具有的功能.Java是面向对象的语言,因此掌握类与对象是学习Java语 ...

  4. java面向对象基础(三):对象转型和多态

    */ .hljs { display: block; overflow-x: auto; padding: 0.5em; color: #333; background: #f8f8f8; } .hl ...

  5. Java学习——面对对象的思想入门

          本文是看过<head first Java>之后的一点感悟,写点东西帮忙以后回忆,Java目前在我的工作中用到还不多,而我又对面对对象的编程非常的感兴趣.曾经在MFC平台上写过 ...

  6. Java入门笔记 03-面向对象(中)

    介绍:这部分内容主要是介绍和总结封装.继承和多态. 一. 封装:把该隐藏的隐藏起来,把该暴露的暴露出来 封装是指将信息隐藏在对象内部,不允许外部程序直接访问对象内部信息,而是通过该类所提供的方法来实现 ...

  7. java基础课程笔记 static 主函数 静态工具类 classpath java文档注释 静态代码块 对象初始化过程 设计模式 继承 子父类中的函数 继承中的构造函数 对象转型 多态 封装 抽象类 final 接口 包 jar包

    Static那些事儿 Static关键字 被static修饰的变量成为静态变量(类变量) 作用:是一个修饰符,用于修饰成员(成员变量,成员方法) 1.被static修饰后的成员变量只有一份 2.当成员 ...

  8. 18.Java 封装详解/多态详解/类对象转型详解

    封装概述 简述 封装是面向对象的三大特征之一. 封装优点 提高代码的安全性. 提高代码的复用性. "高内聚":封装细节,便于修改内部代码,提高可维护性. "低耦合&quo ...

  9. JAVA 入门第二章 (面对对象)

    本渣渣鸽了一个月终于有时间更新.因为有c++基础,学起来这章还是比较简单的,本章我觉得是程序猿质变课程,理解面向对象的思想,掌握面向对象的基本原则以及 Java 面向对象编程基本实现原理,熟练使用封装 ...

随机推荐

  1. div根据鼠标的移入移除显示隐藏

    onmouseout  是把div当成一个对象,div里面包含的元素当成别的对象,所以移动的时候,会隐藏,达不到我们预期的效果. onmouseleave 就是把整个div当成一个对象. 大家可以去试 ...

  2. 【VBA研究】如何用Base64 编解码方法实现简单的加解密

    Base64编码的思想是是采用64个基本的ASCII码字符对数据进行重新编码,将数据变成字符串实现文本传输.由于编码简单,所以很容易实现,代码也是现成的.利用这个编码规则可以实现简单的加解密.编解码方 ...

  3. CAD绘制固定圆形云线标注(网页吧)

    js中实现代码说明: function DoCloudCircleCommentFix() { var comment = mxOcx.NewEntity("IMxDrawComment&q ...

  4. QT5:先导篇 正则表达式

    一.简介 使用正则表达式可以快速完成处理字符串的一些操作,如验证 查找 替换和分割 Qt的QRegExp类是正则表达式的表示类,它基于Perl的正则表达式语言 正则表达式由表达式(expression ...

  5. HTML5 history API与ajax分页实例页面

    <ul id="choMenu" class="rel cho_menu"> <li><a href="ajax.php ...

  6. 笔试算法题(05):转换BST为双向链表 & 查找栈中的最小元素

    出题:把二元查找树转变成排序的双向链表.输入一棵二元查找树,要求将该二元查找树按照中序转换成一个排序的双向链表,要求不能创建任何新的节点,只能调整指针的指向: 分析: 递归的思路,当前节点需要进行的处 ...

  7. Sql语句的一些事(二)

    与sql语句的书写顺序并不是一样的,而是按照下面的顺序来执行 from--where--group by--having--select--order by, from:需要从哪个数据表检索数据 wh ...

  8. PHP实现定时任务的几种方式

    关于定时任务,之前以前认识了一种最常用的:crontab定时任务.通过linux的定时任务去实现.今天又认识了一下php实现定时方式的其它方式,总结一下. 一 服务器定时任务 服务器定时任务,其实就是 ...

  9. 一个关于vue+mysql+express的全栈项目(二)------ 前端构建

    一.使用vue-cli脚手架构建 <!-- 全局安装vue-cli --> npm install -g vue-cli <!-- 设置vue webpack模板 --> vu ...

  10. CentOS7 Failed to start LSB: Bring up/down解决方法(真正有效的方法)

    刚刚装好的虚拟机突然不能上网了,报错很诡异,具体报错如下: /etc/init.d/network restart Restarting network (via systemctl):  Job f ...