对象的类型转换是我们在编程的时候常常会遇到的,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. Nexus环境搭建

    安装 1.解压nexus-2.11.01-bundle.zip到F:\Java\nexus(可自定义) 2.进入F:\Java\nexus\nexus-2.11.1-01\bin\jsw进入相应的系统 ...

  2. 【java_设计模式】建造者模式

    应用场景对生成对象进行链式配置好处:按需配置对象,灵活修改默认配置,比构造方法创建对象更直观. public static void init() {if (okHttpClient == null) ...

  3. 第2节 mapreduce深入学习:9、手机上行流量排序

    还是上次那个例子,需求二:上行流量倒序排序(递减排序) 分析,以需求一的输出数据作为排序的输入数据,自定义FlowBean,以FlowBean为map输出的key,以手机号作为Map输出的value, ...

  4. 使用HTML5+调用手机摄像头和相册

    前言:前端时间使用HTML5做了一个WEB端APP,其中用到了H5页面调用手机摄像头的功能,当时也是花了不少时间去研究.最终是采用了HTML5plus(HTML5+)的方式完成了该功能,现将具体方法简 ...

  5. 邮箱地址自动提示jQuery插件

    // mailAutoComplete.js v1.0 邮箱输入自动提示// 2010-06-18 v2.0 使用CSS class类代替CSS对象,同时增强代码可读性// 2010-06-18 v2 ...

  6. BZOJ 4695 最假女选手 线段树

    题意: 给定一个长度为 N序列,编号从1 到 N.要求支持下面几种操作: 1.给一个区间[L,R] 加上一个数x  2.把一个区间[L,R] 里小于x 的数变成x  3.把一个区间[L,R] 里大于x ...

  7. 大项目之网上书城(九)——订单Demo

    目录 大项目之网上书城(九)--订单Demo 主要改动 1.OrderServiceImpl 代码 2.OrderDaoImpl 代码 3.OrderitemDaoImpl 代码 4.orderite ...

  8. 处理半连接SQL自动改写内连接SQL一例

    昨天刚写了半连接改写系列,今天就遇到了此类型SQL: 优化前 耗时:28s 返回:0 SELECT D.DAILYAUDITNO, D.TRANSTOACC FROM PB_DOIC.MM_DAILY ...

  9. UVa 10129 单词 (欧拉通路)

    题意: 输入n(n≤100000)个单词,是否可以把所有这些单词排成一个序列,使得每个单词的第一个字母和上一个单词的最后一个字母相同(例如acm.malform.mouse).每个单词最 多包含100 ...

  10. sql判断以逗号分隔的字符串中是否包含某个字符串--------MYSQL中利用select查询某字段中包含以逗号分隔的字符串的记录方法

    sql判断以逗号分隔的字符串中是否包含某个字符串---------------https://blog.csdn.net/wttykj/article/details/78520933 MYSQL中利 ...