【Java SE】2.java中变量和表达式计算的相关问题
@[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)不初始化是否报错问题
作为类成员变量,无论初始化与否都不会出错。
作为函数代码里的变量,无论什么类型不初始化全部都会报错。
成员变量会被系统默认初始化,局部变量必须得手写初始化
注:成员变量是指在类体的变量部分中定义的变量,也称为属性。成员变量声明在类中,方法体之外。
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);
//……
//都是可以计算出来的
当我们采用表达式打印超过范围的数时可以通过编译,但其实它会溢出,最后得到一个不符合预期的数值 。
3)其他
为了区分int和long类型,一般建议:long类型变量的初始值之后加L或者l ,同时,为了明显区分数字1和小写l,我们一般写L。
double /float类型的内存布局遵守 IEEE 754 标准(和C语言一样), 使用有限的内存空间表示可能无限的小数, 一定会存在一定的精度误差,所以浮点数都是近似值。同时,由于float比double范围小,所以会优先使用double类型。
Java 的
boolean
类型和 int 不能相互转换, 不存在 1非0表示 true, 0 表示 false 这样的用法,同时也不存在这样的运算boolean value = true;
System.out.println(value + 1);
会编译报错。【编译时可以检查出语法错误】
jvm
规范中没有说boolean
占几个字节,但是在Oracle公司的虚拟机实现中,boolean
占1个字节。除法分为整数除法和小数除法,这点与C类似。
单精度后边是写f或者F,当我们定义时不些的时候会发生隐式类型转换。
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。
- 点赞
- 收藏
- 关注作者
评论(0)