【Java】(3)8种基本数据类型的分析、数据类型转换规则、转义字符的列举

本文涉及的产品
可观测监控 Prometheus 版,每月50GB免费额度
任务调度 XXL-JOB 版免费试用,400 元额度,开发版规格
Serverless 应用引擎免费试用套餐包,4320000 CU,有效期3个月
简介: 牢记类型转换规则在脑海中将编译和运行两个阶段分开,这是两个不同的阶段,不要弄混!

1. 转义字符:

转义字符

  • \

当使用了转义字符那么将不再视为’\n’这是一个字符串而是"一个"字符

  • \n 这是一个"换行符",属于char类型的数据

反斜杠在java语言中具有转义功能

题外话:

  • System.out.println() 和 System.out.print() 的区别;
  • println输出后会进行换行操作,print表示输出,但不换行
转义字符 说明
\a 响铃
\b 退格
\f 换页
\u 联合后面的一串数字是某个文字的unicode编码
\n 换行
\r 回车
\t 制表符
\ \
\’ 单引号
\" 双引号
\0 空字符(null)
\ddd 1~3位八进制数代表的任意字符
\xhh 1~2位十六进制代表的任意字符

注:转义字符出现在特殊字符之前,会将特殊字符转换成普通字符

2. char 字符类型:

一个中文占用2个字节,char类型正好是2个字节;

  • 所以java中的char类型变量可以存储一个中文字符

以下声明报错:123属于字符串,该使用""双引号进行引起来;

- char k = ‘123’;

以下声明报错:"a"是字符串类型,k变量是char类型;

  • char k = “a”;

这属于类型不兼容,编译错误;

char类型正确声明方式:

char k = 'b';

3. 整数类型:

关键字 占用空间大小 取值范围 默认值
byte 1 [ -128 ~ 127 ] 0
short 2 [ -32768 ~ 32767] 0
int 4 [ -2147483648 ~ 2147483647] 0
long 8 0L

3.1 默认类型

java中“整数型字面量” 默认是:

  • int类型

要让“整数型字面值”被当作long类型来处理的话,需要在“整数型字面值”后面添加l/L,建议用大写

long a = 120L;

3.2 java中的整数型有三种表达方式:

第一种方式:十进制【是一种缺省默认的方式】

第二种方式:八进制【在编写八进制整数型字面值的时候需要以0开始】

第三种方式:十六进制【在编写十六进制整数型字面值的时候需要以0x开始】

  • 010 整数型字面值以0开头的,后面那一串数字就是八进制形式
  • 0x10 整数型字面值以0x开头的,后面哪一串字数就是十六进制形式

3.2.1 例子:

long x = 456;
// 小容量可以自动转换成大容量,'456' 被默认设为int类型,但是使用的是long类型声明变量进行赋值,所以会自动转换成long类型;
// 这种机制被称为:自动类型转换机制
long y = 2147483647;

2147483647 是 int类型,占用4个字节

  • 变量 y 是long类型,占用8个字节,自动将 值2147483647 转换成long类型
long z = 2147483648;

这样声明将会报错!在一开始整数型字面量默认当作int类型处理,2147483648已经超出int类型的取值范围所以报错;

  • 因为是在一开始的时候就已经报错,所以long声明的z无法进行类型转换!

解决错误:

long h = 2147483648L;
System.out.println(h); // 输出:2147483648
在值后面加上L;那么这个字面值一开始就会被当作long类型来处理;
2147483648   ------ int类型
2147483648L ------ long类型
// 以下代码不存在类型转换
long u = 2147483648L;
int i = 2416;

3.3 整数类型的转换

  • 以下程序编译报错:大容量不能直接赋值给小容量
long x = 100L;
int y = x;
  • 大容量转换成小容量,需要进行强制类型转换;
    强制类型转型需要加“强制类型转换符”
    加上转换符后编译通过,但是运行阶段可能损失精度
    所以强制类型转换谨慎使用,因为损失精度后可能会损失很严重
  • 强制转换符:(转换的数据类型[int,short,byte,long]) 字面量/字面值
long x = 100L;
int y = (int)x;

3.3.1 强制转换原理:

  • 原始数据:
    00000000 00000000 00000000 00000000 00000000 00000000 00000000 01100100
    8字节long类型

》》》》》》 转换后 》》》》》

  • 强转后的数据:
    00000000 00000000 00000000 01100100
    4字节int类型
  • 将左边的二进制砍掉【所有的数据强转的时候都是这样完成的】
  • 当字面值没有超出byte类型取值范围的话,该字面值可以直接赋值给byte类型的变量;
byte b = 127;

3.3.2 精度损失:

计算机二进制有三种表示形式:

  • 原码
  • 反码
  • 补码

计算机在任何情况下底层表示的和存储数据的时候采用了补码形式。

  • 正数的补码:和原码相同
  • 负数的补码:负数的绝对值对应的二进制码所有的二进制位取反,再加1

补码:10000000

原码计算过程:

  • 10000000 - 1 --> 011111111
  • 10000000 --> 128
  • -128

4. 浮点型:

关键字 精度 占用空间(字节)
float 单精度 4
double 双精度 8

double的精度太低【相对来说】,不适合做财务软件

需要精度高的计算时,会使用SE类库中的一种引用数据类型:java.math.BigDecimal

  • 在java中,所有的浮点型字面值【3.2】,默认被当作double类型来处理;
  • 要想该字面值以float类型来处理,需要在字面值后面添加F/f

无限小数中例如:

  • 1.55555555555555555555555555555555555…

这样的小数在计算机中只能存储近似值;

5. 布尔型:

  • boolean

在java中,boolean类型只有两个值:true、false,没有其他值。

boolean a = false;
boolean b = true;

在底层存储的时候boolean类型占用1个字节,因为实际存储的时候flase底层是0,true底层是1

6. 类型转换

关于基本数据类型之间的互相转化:

  1. 八种数据当中除布尔类型不可转换,剩下的7种类型之间都可以进行转换
  2. 小容量向大容量转换,称为自动类型转换,容量从小到大排序:
  • byte < short < int < long < float < double
    char <

注:任何浮点类型不管占用多少个字节,都比整数型容量大。

char和short可表示的种类数量相同,但是char可以取更大的正整数

大容量转换成小容量,叫做强制类型转换,需要加强制类型转换符,程序才能编译通过,但是在运行阶段可能会损失精度,所以谨慎使用。

当帧数字面值没有超出byte,short,char的取值范围,可以直接赋值给byte,short,char类型的变量。

byte,short,char混合运算的时候,各自先转换成int类型再做运算。

多种数据类型混合运算,先转换成容量最大的类型再做运算。

6.1 例1:

double dd = 10/3;
System.out.println(dd); // 输出3.0

逻辑分析:

在最开始,整数型已经被当做是int类型进行除法,所以得3;

  • 因为赋值的是double类型所以输出的结果是3.0
  • 程序先运行10/3=3;int类型相除取整数!然后赋值给dd变量
  • 变量是double类型,所以结果是3.0

6.2 例2:

dd = 10.0 / 3;
System.out.println(dd); // 输出3.3333333333333335

逻辑分析:

与上方例子不同右方赋值项的式子是

  • double类型 / int类型;
  • 所以在一开始运算结果的时候就3.333333333333
  • 最后将dd重新设置为该值

6.3 例3:

long g = 10;
byte b = (byte)(int)g/3;

编译出错!

逻辑分析:

  1. 24行代码先把g变量弄明白是什么类型了再与3这个int类型做运算公式
  2. 最开始的g是long类型强制转换后成为了int类型再次转换后成为了byte类型
    long类型g > int类型g > byte类型g
  3. 24行代码运算结果 byte类型g(10) / int类型3 = int类型3;
    计算结果是int类型而赋值的变量是byte类型,大容量转小容量,精度受损所以报错

解决方法1:

int b = (byte)(int)g/3;
System.out.println(b);//输出3

解决方法2:

byte b = (byte)(int)(g/3);
System.out.println(b);//输出3

6.4 类型转换总结:

  • 牢记类型转换规则
  • 在脑海中将编译和运行两个阶段分开,这是两个不同的阶段,不要弄混!

7. ❤️Java基础专栏 - 前篇回顾

8. 💕👉 其他好文推荐

目录
相关文章
|
21小时前
|
JavaScript 前端开发 Java
【GoWails】Go做桌面应用开发?本篇文章带你上手Wails框架!一步步带你玩明白前后端双端的数据绑定!
wails是一个可以让你使用Go和Web技术编写桌面应用的项目 可以将它看作Go的快并且轻量级的Electron替代品。可以使用Go的功能,并结合现代化UI完成桌面应用程序的开发
22 4
|
21小时前
|
Java 编译器 Go
【Golang】(5)Go基础的进阶知识!带你认识迭代器与类型以及声明并使用接口与泛型!
好烦好烦好烦!你是否还在为弄不懂Go中的泛型和接口而烦恼?是否还在苦恼思考迭代器的运行方式和意义?本篇文章将带你了解Go的接口与泛型,还有迭代器的使用,附送类型断言的解释
21 2
|
21小时前
|
Java Go 开发工具
【Java】(9)抽象类、接口、内部的运用与作用分析,枚举类型的使用
抽象类必须使用abstract修饰符来修饰,抽象方法也必须使用abstract修饰符来修饰,抽象方法不能有方法体。抽象类不能被实例化,无法使用new关键字来调用抽象类的构造器创建抽象类的实例。抽象类可以包含成员变量、方法(普通方法和抽象方法都可以)、构造器、初始化块、内部类(接 口、枚举)5种成分。抽象类的构造器不能用于创建实例,主要是用于被其子类调用。抽象类中不一定包含抽象方法,但是有抽象方法的类必定是抽象类abstract static不能同时修饰一个方法。
22 0
|
21小时前
|
Java Unix Go
【Java】(8)Stream流、文件File相关操作,IO的含义与运用
Java 为 I/O 提供了强大的而灵活的支持,使其更广泛地应用到文件传输和网络编程中。!但本节讲述最基本的和流与 I/O 相关的功能。我们将通过一个个例子来学习这些功能。
22 1
|
21小时前
|
Java 测试技术 数据库连接
【SpringBoot(四)】还不懂文件上传?JUnit使用?本文带你了解SpringBoot的文件上传、异常处理、组件注入等知识!并且带你领悟JUnit单元测试的使用!
Spring专栏第四章,本文带你上手 SpringBoot 的文件上传、异常处理、组件注入等功能 并且为你演示Junit5的基础上手体验
44 2
|
21小时前
|
存储 安全 Java
【Golang】(4)Go里面的指针如何?函数与方法怎么不一样?带你了解Go不同于其他高级语言的语法
结构体可以存储一组不同类型的数据,是一种符合类型。Go抛弃了类与继承,同时也抛弃了构造方法,刻意弱化了面向对象的功能,Go并非是一个传统OOP的语言,但是Go依旧有着OOP的影子,通过结构体和方法也可以模拟出一个类。
14 1
|
21小时前
|
XML JSON Java
【SpringBoot(三)】从请求到响应再到视图解析与模板引擎,本文带你领悟SpringBoot请求接收全流程!
Springboot专栏第三章,从请求的接收到视图解析,再到thymeleaf模板引擎的使用! 本文带你领悟SpringBoot请求接收到渲染的使用全流程!
21 3
|
21小时前
|
JavaScript Java Maven
【SpringBoot(二)】带你认识Yaml配置文件类型、SpringMVC的资源访问路径 和 静态资源配置的原理!
SpringBoot专栏第二章,从本章开始正式进入SpringBoot的WEB阶段开发,本章先带你认识yaml配置文件和资源的路径配置原理,以方便在后面的文章中打下基础
30 3
|
21小时前
|
XML Java 应用服务中间件
【SpringBoot(一)】Spring的认知、容器功能讲解与自动装配原理的入门,带你熟悉Springboot中基本的注解使用
SpringBoot专栏开篇第一章,讲述认识SpringBoot、Bean容器功能的讲解、自动装配原理的入门,还有其他常用的Springboot注解!如果想要了解SpringBoot,那么就进来看看吧!
18 2
|
21小时前
|
JSON Java API
(ELK)ElasticSearch8.7 搭配 SpringDataElasticSearch5.1 的使用
截至2023/7/11日,全网最全最直白的SpringDataElasticSearch5.1
25 2

热门文章

最新文章