危险的转型操作 | 带你学《Java面向对象编程》之六十三

简介: 在之前的文章中已为读者讲述了对象的转型操作,但这样的操作中往往伴随着极大的风险。究竟如何呢?一起来看看吧。

上一篇:掌握接口,从这三则案例开始! | 带你学《Java面向对象编程》之六十二
【本节目标】
通过阅读本节内容,你将复习一次关于向上、向下转型的实现方法,并意识到转型过程中可能会发生的风险。

泛型是从JDK1.5之后追加到Java语言里面的,其主要目的是为了解决ClassCastException的问题,在进行对象的向下转型时永远都可能存在有安全隐患,而Java希望通过泛型可以慢慢解决掉此类问题。

泛型的问题引出

现在假设定义一个描述x与y坐标的处理类,并且在这个类之中允许开发者保存三类数据:

  • 整型数据:x = 10、y = 10 ;
  • 浮点型数据: x = 10.1、y = 20.9 ;
  • 字符串型数据: x = 东经120度、北纬30度;
class Point {
    private x ;
    private y ;
}

于是在设计Point类的时候就需要去考虑具体的x和y属性的类型,这个类型要求可以保存以上三种数据,很明显,最为原始的做法就是利用Object类来进行定义,因为存在有如下的转型关系:

  • 整型数据:基本数据类型→包装为Integer类对象→自动向上转型为Object;
  • 浮点型数据:基本数据类型→包装为Double类对象→自动向上转型为Object
  • 字符串型数据:String类对象→自动向上转型为Object

范例:定义Point类如下

class Point {
    private Object x ;
    private Object y ;
    public void setX(Object x) {
        this.x = x ;    
    }
    public void setY(Object y) {
        this.y = y ;
    }
    public Object getX() {
        return this.x ;
    }
    public Object getY() {
       return this.y ;
    }
}

而后下面进行内容的设置。
范例:进行正确的内容操作

class Point {
    private Object x ;
    private Object y ;
    public void setX(Object x) {
        this.x = x ;    
    }
    public void setY(Object y) {
        this.y = y ;
   }
   public Object getX() {
       return this.x ;
   }
   public Object getY() {
       return this.y ;
   }
}
public class JavaDemo {
    public static void main(String args[]) {
        Point point = new Point() ;
    //第一步:根据需求进行内容的设置
        point.setX(10) ;    //自动装箱
        point.setY(20) ;    //自动装箱
    //第二步:从里面获取数据
        int x = (Integer) point.getX() ;
        int y = (Integer) point.getY() ;
        System.out.println(“x坐标:” + x + “、y坐标:” + y) ;
    }  //执行结果:x坐标:10、y坐标:20
}

本程序之所以可以解决当前的设计问题,主要的原因在于,Object可以接收所有数据类型,但是正因为如此,所以本代码也会出现有严重的安全隐患。
范例:观察错误

public class JavaDemo {
    public static void main(String args[]) {
        Point point = new Point() ;
    //第一步:根据需求进行内容的设置
        point.setX(10) ;    //自动装箱
        point.setY(“北纬20度”) ;    //自动装箱
    //第二步:从里面获取数据
        int x = (Integer) point.getX() ;
        int y = (Integer) point.getY() ;
        System.out.println(“x坐标:” + x + “、y坐标:” + y) ;
    }  
}

此时的程序明显出现了问题,如果在程序编译的时候,实际上是不会有任何错误产生的,而程序执行的时候就会出现“ClassCastException”异常类型,所以本程序的设计是存在有安全隐患的。而这个安全隐患存在的依据在于使用了Object类型,因为Object可以涵盖的范围太广了,而对于这样的错误如果可以直接出现在编译的过程之中,那么就可以避免运行时的尴尬。

想学习更多的Java的课程吗?从小白到大神,从入门到精通,更多精彩不容错过!免费为您提供更多的学习资源。
本内容视频来源于阿里云大学

下一篇:泛型带你规避风险 | 带你学《Java面向对象编程》之六十四
更多Java面向对象编程文章查看此处

相关文章
|
2月前
|
Java 开发者
在Java面向对象编程的广阔海洋中,多态犹如一股深邃的潜流,它推动着代码从单一走向多元,从僵化迈向灵活。
在Java面向对象编程的广阔海洋中,多态犹如一股深邃的潜流,它推动着代码从单一走向多元,从僵化迈向灵活。
35 7
|
2月前
|
Java 开发者
那些年,我们一同踏入Java编程的大门,多态,这个充满魔法的名字,曾无数次点亮我们探索面向对象编程的热情。
那些年,我们一同踏入Java编程的大门,多态,这个充满魔法的名字,曾无数次点亮我们探索面向对象编程的热情。
41 5
|
2月前
|
Java 程序员
Java中的继承和多态:理解面向对象编程的核心概念
【8月更文挑战第22天】在Java的世界中,继承和多态不仅仅是编程技巧,它们是构建可维护、可扩展软件架构的基石。通过本文,我们将深入探讨这两个概念,并揭示它们如何共同作用于面向对象编程(OOP)的实践之中。你将了解继承如何简化代码重用,以及多态如何为程序提供灵活性和扩展性。让我们启程,探索Java语言中这些强大特性的秘密。
|
3月前
|
Java BI 数据处理
如何在Java中实现Excel操作
如何在Java中实现Excel操作
|
4月前
|
存储 Java
java用modbus4j的RTU去操作那些寄存器(线圈,保持,输入,离散输入寄存器)
java用modbus4j的RTU去操作那些寄存器(线圈,保持,输入,离散输入寄存器)
93 0
|
2月前
|
存储 前端开发 JavaScript
【前端学java】面向对象编程基础-类的使用(4)
【8月更文挑战第9天】面向对象编程基础-类的使用
14 0
【前端学java】面向对象编程基础-类的使用(4)
|
3月前
|
存储 Java 索引
Java ArrayList操作指南:如何移除并返回第一个元素
通过上述方法,你可以方便地从Java的 `ArrayList` 中移除并返回第一个元素。这种操作在日常编程中非常常见,是处理列表时的基本技能之一。希望这篇指南能帮助你更好地理解和运用Java的 `ArrayList`。
39 4
|
2月前
|
Java 程序员 开发者
Java的面向对象编程:从基础到深入
【8月更文挑战第21天】在本文中,我们将探讨Java的面向对象编程(OOP)的核心概念,包括类、对象、继承、多态和封装。我们将通过实例和比喻,以通俗易懂的方式,深入理解这些概念的内涵和意义,以及它们如何影响我们的编程思维和实践。无论你是初学者还是有经验的开发者,这篇文章都将帮助你更深入地理解Java的OOP,并启发你思考如何在你的项目中应用这些概念。
|
3月前
|
分布式计算 DataWorks Java
DataWorks操作报错合集之使用ODPS Tunnel Upload功能时,遇到报错:Java 堆内存不足,该如何解决
DataWorks是阿里云提供的一站式大数据开发与治理平台,支持数据集成、数据开发、数据服务、数据质量管理、数据安全管理等全流程数据处理。在使用DataWorks过程中,可能会遇到各种操作报错。以下是一些常见的报错情况及其可能的原因和解决方法。
|
3月前
|
SQL 缓存 Java
使用MyBatis优化Java持久层操作
使用MyBatis优化Java持久层操作
下一篇
无影云桌面