【Java SE】2.java中变量和表达式计算的相关问题

举报
Velpro_yanan 发表于 2022/09/01 10:13:54 2022/09/01
【摘要】 @[toc] 一、变量 1.概念、语法格式以及分类概念:这些经常改变的内容,在Java程序中,称为变量。语法:数据类型 变量名 = 初始值;分类:与基本数据类型(如下表所示)相对应数据类型关键字内存占用包装类字节型byte1字节Byte短整型short2字节Short整形int4字节Integer长整型long8字节Long单精度浮点型float4字节Float双精度浮点型double8字...

@[toc]

一、变量

1.概念、语法格式以及分类

概念:这些经常改变的内容,在Java程序中,称为变量。

语法:数据类型 变量名 = 初始值;

分类:与基本数据类型(如下表所示)相对应

数据类型 关键字 内存占用 包装类
字节型 byte 1字节 Byte
短整型 short 2字节 Short
整形 int 4字节 Integer
长整型 long 8字节 Long
单精度浮点型 float 4字节 Float
双精度浮点型 double 8字节 Double
布尔型 boolean 没有明确规定 Boolean
字符型 char 2字节 Character

2.注意

1)不初始化是否报错问题

作为类成员变量,无论初始化与否都不会出错。

作为函数代码里的变量,无论什么类型不初始化全部都会报错。

成员变量会被系统默认初始化,局部变量必须得手写初始化

注:成员变量是指在类体的变量部分中定义的变量,也称为属性。成员变量声明在类中,方法体之外。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wilL6QWZ-1658801468503)(C:\Users\19271\AppData\Roaming\Typora\typora-user-images\image-20220726091959792.png)]

2)变量范围与超过范围是不是报错问题

//1.可以通过包装类直接得到数据类型的最大值最小值
//2.字面常量赋值超过范围——不能通过编译

// int型变量所能表示的范围 
System.Out.println(Integer.MIN_VALUE); System.Out.println(Integer.MAX_VALUE);
// long型变量所能表示的范围:这个数据范围远超过 int 的表示范围. 一般在大型工程场景使用.
System.Out.println(Long.MIN_VALUE); System.Out.println(Long.MAX_VALUE);
// short型变量所能表示的范围
System.Out.println(Short.MIN_VALUE); System.Out.println(Short.MAX_VALUE);
// byte型变量所能表示的范围: 
System.Out.println(Byte.MIN_VALUE); System.Out.println(Byte.MAX_VALUE);
//……
//都是可以计算出来的

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wVrMx0HQ-1658801468505)(C:\Users\19271\AppData\Roaming\Typora\typora-user-images\image-20220726092642082.png)]

当我们采用表达式打印超过范围的数时可以通过编译,但其实它会溢出,最后得到一个不符合预期的数值 。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ADdNKxdK-1658801468507)(C:\Users\19271\AppData\Roaming\Typora\typora-user-images\image-20220726093126503.png)]

3)其他

  1. 为了区分int和long类型,一般建议:long类型变量的初始值之后加L或者l ,同时,为了明显区分数字1和小写l,我们一般写L

  2. double /float类型的内存布局遵守 IEEE 754 标准(和C语言一样), 使用有限的内存空间表示可能无限的小数, 一定会存在一定的精度误差,所以浮点数都是近似值。同时,由于float比double范围小,所以会优先使用double类型

  3. Java 的 boolean 类型和 int 不能相互转换, 不存在 1非0表示 true, 0 表示 false 这样的用法,同时也不存在这样的运算boolean value = true; System.out.println(value + 1);会编译报错。【编译时可以检查出语法错误】

  4. jvm规范中没有说boolean占几个字节,但是在Oracle公司的虚拟机实现中,boolean占1个字节。

  5. 除法分为整数除法和小数除法,这点与C类似。

  6. 单精度后边是写f或者F,当我们定义时不些的时候会发生隐式类型转换。

  7. java中的char采用的是Unicode编码,并且是两个字节,所以可以放中文

    【在使用命令窗口编译时,如果在执行出现不能正确解析汉字的情况,那么这时需要加入一条语句,参考之前写的java程序运行那篇笔记

3.拓展

1.Unicode字符集不仅可以表示英文还有希腊文、中文等其他国家的语言,向下兼容ASCII字母集,但其实我们做题只是绝大多数时候用的ASCII里边的,所以没有必要再去专门研究这个字母集。

2.谈论char的最小最大其实没有太大意义。他们没有符号位【所以共有65535个】,本质上是字符,但是我们经常用的IDEA无法正常解析出来,并且他也没有太大的应用场景。

二、有关表达式计算中的类型问题【!!!】

这里的大小是指表示能力。

1.类型转换

1)小转大——隐式类型转换

//1.在变量之间赋值过程中——整形家族
//byte<shot<int<long
int a = 10; 
long b = 100L;
b = a; // 可以通过编译 
a = b; // 编译失败

//2.在变量之间赋值过程中——浮点家族
float f = 3.14F;
double d = 5.12; 
d = f; // 编译器会将f转换为double,然后进行赋值
f=d;//虽然不安全,但是可以通过编译,只不过可能会有精度丢失

//3.在打印过程中——主要体系体现在打印精度上
System.Out.println(1024); // 整型默认情况下是int System.Out.println(3.14); // 浮点型默认情况下是double

//4.特殊的——short和byte
byte b1 = 100; //在范围内,发生隐式类型转换
byte b2 = 257; //失败,257超过了byte的数据范围,有数据丢失
//类似的short也是这样

2)大转小——强制类型转换

//1.关于byte的计算
//同类型相加也会进行转换
byte a1=100;
byte a2=50;
byte ret=(byte)(a1+a2);//计算机计算时的最小操作单位摆在那了——最小是4字节

//超范围的时候
byte b1 = 100; // 100默认为int,没有超过byte范围,隐式转换
byte b2 = (byte)257; // 257默认为int,超过byte范围,需要显示转换,否则报错

//2.整形/浮点型,精度大的给小的
//同家族之间交叉
int a = 10; 
long b = 100L;
b = a; // int-->long,数据范围由小到大,隐式转换
a = (int)b; // long-->int, 数据范围由大到小,需要强转,否则编译失败 float f = 3.14F;

double d = 5.12; 
d = f; // float-->double,数据范围由小到大,隐式转换
f = (float)d; // double-->float, 数据范围由大到小,需要强转,否则编译失败

//不同类型交错
//eg.double和int
a = d; // 报错,类型不兼容 ——这里跟C中不同,这里直接不能通过编译
a = (int)d; // double没有int表示的数据范围大,需要强转,小数点之后全部丢弃
注意

没有意义,但是可以:比如double&char【打印的都是字符,同时double会把小数丢了】

对于不相干的类型,存在强制类型转换也不行钉子户,最典型的就是布尔类型和其他任何类型。

2.类型提升

运算时,不同但属于同一大类进行计算时小类型会提升至大类型,与C是一样的。

同时java与C一样,整型算术运算总是至少以缺省【缺省即默认】整型类型的精度来进行的。

这里我们经常看到的就是,byte运算时的整型提升、int到long的、float到double。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JbyKAs5A-1658801468508)(C:\Users\19271\AppData\Roaming\Typora\typora-user-images\image-20220726095900594.png)]

在这里插入图片描述

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。