[初识Java]数据类型和变量

✍️大家好,我是枫晨,今天继续带大家初识Java,今天除了正文外,我还要推荐一本书籍《java核心技术 卷1》非常适合初学者
🖥️专栏推荐:
C语言专栏:C语言学习教程
Java专栏 :初识JavaSE系列


img

一、字面常量

简单来说就是程序运行期间,固定不变的量。

字面常量分类:

字符串常量:由""括起来的,比如“12345”、“hello”、“你好”。
整形常量:程序中直接写的数字(注意没有小数点),比如:100、1000
浮点数常量:程序中直接写的小数,比如:3.14、0.49
字符常量:由 单引号 括起来的当个字符,比如:‘a’ ‘b’
布尔常量:只有两种true和false
空常量:null(后面了讲)

二、数据类型

首先要明白,java中数据类型分为基本数据类型引用数据类型

其中基本数据类型共有4类共8种:
4类:整形、浮点型、字符型、布尔型
8种:字节型,短整形,长整形,浮点型,双精度浮点型,字符型,布尔型

基本数据类型关键字大小取值范围
字节型byte1字节-128~-127
短整形short2字节-215~-215-1
整形int4字节-231~231-1
长整型long8字节-263~263-1
浮点型float4字节特殊
双精度浮点型double8字节特殊
字符型char2字节0 ~ 65535
布尔型boolean没有明确规定true或者false

与C语言不同,int类型不论是在32/64位机器,其大小均为4个字节,long都占8个字节。
整形和浮点型 都是有符号数
整形默认为int型,浮点型默认为double,在定义float类型变量时候必须在数字后面加上f/F;

三、变量

3.1整形

1.在java中,int、short、long均为有符号类型,不存在c语言中的无符号类型byte和short类型更加适合用于底层文件的处理。

2.java可移植性体现:
整型的范围与运行 Java 代码的机器无关。这就解决了软件从一个平台移植到另一个平台,或者在同一个平台中的不同操作系统之间进行移植给程序员带来的诸多问题。与此相反,C 和 C++ 程序需要针对不同的处理器选择最为高效的整型, 这样就有可能造成一个在32 位处理器上运行很好的 C 程序在 16 位系统上运行却发生整数溢出。由于 Java 程序必须保证在所有机器 L都能够得到相同的运行结果, 所以各种数据类型的取值范围必须固定。

3.long类型使用注意事项:长整型数值有一个后缀L或l如:100L;

3.2浮点型:

三个特殊的浮点数值:
**·**正无穷大
**·**负无穷大
**·**NaN(不是一个数字)

举个栗子:一 个正整数除以 0 的结果为正无穷大。计算 0/0 或者负数的平方根结果为 NaN

在《java核心技术 卷1》中有这样一个警告:

image-20220421160240259

计算两个数相除时候,当参与 / 运算的两个操作数都是整数时, 表示整数除法;否则, 表示浮点除法。 整数的求余操作(有时称为取模) 用 % 表示。例如,15/2 等于 ,7 15%2 等于 1 , 15.0/2 等于 7.50

3.2字符类型

1.与c语言中的char类型不同,java中的char类型是2个字节,这意味着java中的char可以表示中文
2.char类型不用用于表示负数,当将一个整数赋值给char类型时候,这个整数如果在char类型取值范围内,则会对应Unicode字符集中对应数字对应的字符
3.c语言中使用的是ASCII码字符集,而java中使用的是Unicode字符集

3.4布尔类型

boolean (布尔)类型有两个值:false 和 true, 用来判定逻辑条件 整型值和布尔值之间不能进行相互转换

java中不存在0表示假,非0表示真的用法。

Java虚拟机规范中,并没有明确规定boolean占几个字节

3.5数值类型之间的转换

Java 作为一个强类型编程语言, 当不同类型之间的变量相互赋值的时候, 会有教严格的校验.

int a = 10;
long b = 100L;
b = a;//存在隐式类型提升
a = b;//编译失败

在Java中,当参与运算数据类型不一致时,就会进行类型转换。Java中类型转换主要分为两类:自动类型转换(隐式) 和 强制类型转换(显式)。

3.5.1隐式类型转换

自动类型转换即:代码不需要经过任何处理,在代码编译时,编译器会自动进行处理
特点:数据范围小的转为数 据范围大的时会自动进行。

float f = 3.14F;
double d = 5.12; 
d = f; // 编译器会将f转换为double,然后进行赋值

3.5.2显式类型转换

强制类型转换:当进行操作时,代码需要经过一定的格式处理,不能自动完成。

特点:数据范围大的到数据范围小的

int a = 10;
long b = 100L;
a =(int) b;//使用强制类型转换

值得注意的是,布尔类型无论是数据范围大还是小之间的转换,都是不合理的

int a = 0;
boolean flag = true;
a = flag; // 编译失败:类型不兼容 flag = a; // 编译失败:类型不兼容

特殊:

int i = 10;
float f = 19.9f;
i = f;//编译器会报错
i =(int)f;

虽然float与int都是4个字节,但是float类型能表示数据的宽度除了整数还能表示小数,这样直接将一个浮点数给一个整数,会出现问题,如果想实现,使用强制类型转换。

同样,将int类型值赋值给float类型,也可能会失去一定精度,因为float在内存中有一定区域是用于存储小数的,当int数据大于了float类型用于存储整数的区域时,可能会失去一定精度。

注意事项:

不同数字类型的变量之间赋值, 表示范围更小的类型能隐式转换成范围较大的类型
如果需要把范围大的类型赋值给范围小的, 需要强制类型转换, 但是可能精度丢失
将一个字面值常量进行赋值的时候, Java 会自动针对数字范围进行检查
强制类型转换不一定能成功,不相干的类型不能互相转换

3.6类型提升

不同类型的数据之间相互运算时,数据类型小的会被提升到数据类型大的。

1.int与long之间:int会被提升为long

int a = 10;
long b = 20L;
int c = a+b;//err-编译出错
long d = a+b;//编译成功 a + b==>int + long--->long + long 赋值给long

解析:
int c = a +b;–>a+b==>int + long ===> long + long 赋值给int时会丢失数据
解决编译报错问题:
int c = (int) a +b;

2.byte与byte计算

byte a = 10; 
byte b = 20;
byte c = a + b; 
System.out.println(c); // 编译报错 错误: 不兼容的类型: 从int转换到byte可能会有损失 

结论 :
byte 和 byte 都是相同类型, 但是出现编译报错. 原因是, 虽然 a 和 b 都是 byte, 但是计算 a + b 会先将 a和 b 都提升成 int, 再进行计算, 得到的结果也是 int, 这是赋给 c, 就会出现上述错误.由于计算机的 CPU 通常是按照 4 个字节为单位从内存中读写数据. 为了硬件上实现方便, 诸如 byte 和 short这种低于 4 个字节的类型, 会先提升成 int, 再参与计算

解决办法:
byte c =(byte) a + b;//编译成功


到这里我们的初识java第二篇就结束啦,真的强力推荐大家在阅读完我的文章以后再去深入阅读《java核心卷 Ⅰ》这本书,我只是带着大家渐入佳境,这本书可以带着大家更加深入。
82b8d29070a4053e0310395c964f0357

  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

XY枫晨

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值