自学Java6(保姆级教学)——基本数据类型的转换

createh55个月前 (02-01)技术教程50

在上一期的文章中,我们认识了Java的几种运算符,先来简单回顾一下Java共有几类运算符:

1.算数运算符:+,-,*,/(加减乘除),加上一个%(取余)

2.赋值运算符:=

3.关系运算符:>,<,==,!=

4.逻辑运算符:&,|,^和!

5.短路运算符:&&和||

6.三目运算符(也有叫三元运算符):a>b ? a : b

篇幅所限,这里不再多做赘述,感兴趣的小伙伴可以去看看我前面的几篇文章,相对写得还是比较详细的。

那么,本期文章我们来说一下,我们为什么会用到数据类型的转换?这个例子其实在我们的生活中是经常发生的,比如:你买东西,一件T恤50元,一件裤子40.5元,那么我一共要付多少钱呢?对于我们人来说,这就是个很简单的加法运算,恐怕一年级的学生也不会做错,但是对于计算机而言,这就不是我们看上去的那么简单的一个过程了。

如果是我们用Java去计算的话,我们会将T恤的价格定义为整数型的变量,会将裤子的价格定义为浮点型的变量,那么问题就来了,我们需要定义一个什么类型的变量去接受这两个变量的和呢?或者说,这两个变量,在不做其他操作的情况下,是否可以相加呢?那么我们可以去Java代码中去实验一下,分别用int和double类型的变量去接受一下结果,看看是什么情况:

首先是用int类型去接收:

其实我们的开发工具已经很智能在给我们报错了(其实有点基础的都知道这是IDEA,但是为了照顾基础差的同学,我们暂时不去管这是什么软件,我们只需要去看它出现的现象就可以了),那么我们运行一下,看看具体的输出结果:

可能有很多初学的小伙伴看不懂是什么意思,但是你只要看得懂中国字,应该也就大概知道出了什么问题:“不兼容的类型: 从double转换到int可能会有损失”,说明当int类型的数据与double类型的数据去相加的时候,我们需要去用double去接受,到底是不是这样呢?我们眼见为实:

这里开发工具就没有给我们报错,运行看看结果是否正确:

正确的输出了90.5的答案,那么为什么会出现这样的情况呢?

首先我们假设int可以接收它们两者的和,但是90.5,很明显是个小数,而我们的int只能存储或者说定义整数,那么我们如果用int去接收这个数的话,最多也就只能只能接收整数的部分,即90,那么后面的0.5就会损失掉,这就是前面报错提到的精度损失。但是很奇怪的是,为什么用double就可以接收了呢?那是因为浮点型的取值范围是要大于整数型的,而整数型的数据,比如说上文中的50,可以写成50.0,并不会有任何的精度损失,那么由较小的取值范围转换为较大的取值范围的这么一个过程,我们就叫它作自动类型转换

那么说到这里,可能有的小伙伴就要不服了,那我们就要用int去接收呢?难道就没办法了吗?很明显,办法是有的,但是肯定是要损失精度的,我们可以使用强制类型转换:

如图所示:这样的话程序就不会报错,但是我们看一下运行结果:

结果就变成了90,很明显,和实际的90.5还是有一定的偏差的。由此可以看出,强制类型其实是由范围较大的数据转换为范围较小的数据的这么一个过程,但是这个过程肯定是会损失精度的。

这里,我按照取值范围由小到大的顺序,给大家拍一下整数型和浮点型:

byte

从左至右则是自动类型转换,从右至左则需要进行强制类型转换。

其实这个稍微拓展一点,我个人觉得有点类似于java三大特性中的多态。如果是没有基础的小伙伴,这一段可以不用看,因为这一段是属于我自己的一个扩展的想法,有基础的同学可以跟着这个思路去拓展一下:

我们都知道Java的多态是父类引用指向子类对象,其实这个说白了,也是一种由大到小的这么一个转换,就好比说,我们可以说子类一定是父类,但是我们不能说父类一定是子类。举个例子:如果我们将总的生物类作为父类的话,那么人,植物和动物都可以做它的子类,我们可以说人是生物,也可以说植物是生物,但是我们不能反过来说,生物是人,或者生物是植物这样的话,那样很明显不符合逻辑,很明显父类的范围是要大于子类的范围的,所以我觉得强制转换其实和多态是存在一定的可对比性的,我们可以将知识进行串联和比较,这样会更有利于我们对知识的理解。

最后更文不易,希望大家可以多多点赞评论分享,当然如果可以留下一个关注自然是更好的啦~您的支持就是我更文最大的动力!

相关文章

JAVA教程全集-电子版(中)(java教程电子书下载)

第4章 面向对象的程序设计基础如前所述,Java语言是一种纯面向对象的编程语言,面向对象的程序设计是以类为基础的。从本章开始,我们将从类入手,详细介绍面向对象程序设计的基本思想和方法。本章将简要介绍面...

这些Java基础知识,诸佬们都还记得嘛(学习,复习,面试均可)

方法重载和方法重写的区别方法重写重写体现在继承关系上。 在Java中,子类继承父类,子类就会具备父类所以的特征,以及父类的方法和变量比如动物类有“叫”的方法,小狗小猫分别继承了动物类,重写方法时就可以...

Java:Java中的多重继承问题(java中实现多重继承的方式)

  继承是面向对象编程 (OOP) 语言(如 Java)的主要功能之一。它是一种以增强软件设计中类重用能力的方式组织类的基本技术。多重继承是众多继承类型中的一种,是继承机制的一个重要原则。本文探讨了一...

Java|剖析类内的五类成员:属性、方法、构造器、代码块、内部类

Java的哲学是一切皆类,全部代码都写在类内。Java是纯面向对象的编程语言,类是其基石。Java类有五类成员:class Person{ // ① 属性,或成员变量 String n...

C++_类和对象_C++继承_继承中子类的同名成员处理

然后我们再来看,如果继承的过程中,子类中,也有一个和父类中同名的,变量,或者函数怎么办??.我们先去写个Base类,然后base类中去声明一个m_A = 100;这个变量.在构造方法中赋值100;?然...

php中接口、抽象类以及接口和抽象类区别详解

在php中接口抽象类、Final、Static几个我们用到的相当的简单特别是大型网站架构时都会有用到了,今天我们来看一篇关于php中抽象类、Final、Static的例子。1. 接口(1)对接口的使用...