变量类型
- 基本类型的变量
- 引用类型的变量。
命名
- 由字母、数字、下划线、美元符组成
- 不能以数字开头
- 不能是java的关键字和保留字
- 区分大小写
- 可读性,便于提高效率
驼峰命名法
变量名是一个单词,就纯小写
- int age
变量名是多个英语单词组成,第二个开始首字母大写
- int studentAge
一般常量用全大写字母,如果是多个单词,就用下划线连接
- final int STUDENT_NUM
整型
类型 | 范围 |
---|---|
byte | -128~127 |
short | -32768~32767 |
int | -2147483648~2147483647 |
long | 2^63~2^63-1 |
定义整型
public class Main {
public static void main(String[] args) {
int i = 2147483647;
int i2 = -2147483648;
int i3 = 2_000_000_000; // 加下划线更容易识别
int i4 = 0xff0000; // 十六进制表示的16711680
int i5 = 0b1000000000; // 二进制表示的512
long l = 9000000000000000000L; // long型的结尾需要加L
}
}
- 同一个数的不同进制的表示是完全相同的,例如15=0xf=0b1111
用一个整数直接给long变量赋值,如果超出了int类型的数据范围,得添加l或L后缀
- long 10000000000L;
- "L"理论上不分大小写,但是若写成"l"容易与数字"1"混淆,不容易分辩。所以最好大写
超过之后溢出
public class hello {
public static void main(String[] args) {
int max = 2147483647;
int over = max + 1;
System.out.println(over);
}
}
//输出:-2147483648
浮点型
浮点类型的数就是小数,因为小数用科学计数法表示的时候,小数点是可以“浮动”的,如1234.5可以表示成12.345x10²,也可以表示成1.2345x10³,所以称为浮点数。
定义浮点数
float f1 = 3.14f;
float f2 = 3.14e38f; // 科学计数法表示的3.14x10^38
double d = 1.79e308;
double d2 = -1.79e308;
double d3 = 4.9e-324; // 科学计数法表示的4.9x10^-324
- 浮点数被转换成整数时,小数点部分被完全砍掉,而非四舍五入
用带小数点的数字给float变量赋值,得添加f或者F后缀,或用double
- float 1.5F;
- float变量的默认值为0.0f
- float内存字节4
浮点数计算
会产生误差
public class Study_2 {
public static void main(String[] args) {
double a = 1.0 / 10;
double b = 1 - 9.0 / 10;
System.out.println(a);
System.out.println(b);
}
}
以上实例输出为:
0.1
0.09999999999999998
所以比较两个浮点数是否相等常常会出现错误的结果。正确的比较方法是判断两个浮点数之差的绝对值是否小于一个很小的数:
// 比较x和y是否相等,先计算其差的绝对值:
double r = Math.abs(x - y);
// 再判断绝对值是否足够小:
if (r < 0.00001) {
// 可以认为相等
} else {
// 不相等
}
字符型
char a = 'A';
char zh = '中';
- char类型使用单引号',且仅有一个字符,要和双引号"的字符串类型区分开。
- char数据类型可以储存任何字符
- char变量存储的是某个字符的编码值,是一个正整数,所以在合理范围内可以直接赋值整数给char,不用加单引号
不同类型数据运算的规则
public class hello {
public static void main(String[] args) {
int a = 8;
int b = 3;
double c = ++a / --b;
System.out.println(c);
}
}
//输出:4.0
- 两个类型相同的操作数进行算数运算,其结果类型与操作数相同
- 两个类型不同的操作数进行算数运算,其结果类型与精度较高的那个操作数相同
类型转换
- 不能对boolean类型进行类型转换。
- 不能把对象类型转换成不相关类的对象。
在把容量大的类型转换为容量小的类型时必须使用强制类型转换,反之则不用。强制类型转换格式:(数据类型)操作数;
- 如:double d=1.5;float f=(float)d;
转换过程中可能导致溢出或损失精度,例如
public class test { public static void main(String[] args) { int i =128; byte n=(byte)i; System.out.println(n); } }
以上事例输出为:-127
因为 byte 类型是 8 位,最大值为127,所以当 int 强制转换为 byte 类型时,值 128 时候就会导致溢出。
浮点数到整数的转换是通过舍弃小数得到,而不是四舍五入
public class test { public static void main(String[] args) { int i =(int)23.3; System.out.println(i); } }
以上实例输出为:23
常见错误
- 命名不规划范
- 未经初始化变量不可使用
离开了“作用域”不可使用
- 大括号之内声明的变量,出了大括号不好使
其他注意事项
- boolen类型默认值是false
final定义一个只能被赋值一次的量
- final pi;pi=5;
- 基本类型类型以及对象的引用变量是存储在栈内存中 ;而对象本身的值或者说 new 创建的对象和数组是存储在堆内存中。
引用类型
除了上面的基本数据类型,其他的都是引用类型了,常见的是String字符串
String s = "hello";
- 引用类型的变量类似于C语言的指针,它内部存储一个“地址”,指向某个对象在内存的位置
var关键字
有些时候,类型的名字太长,写起来比较麻烦。例如:
StringBuilder sb = new StringBuilder();
这个时候,如果想省略变量类型,可以使用var关键字:
var sb = new StringBuilder();
编译器会根据赋值语句自动推断出变量sb的类型是StringBuilder。对编译器来说,语句:
var sb = new StringBuilder();
实际上会自动变成:
StringBuilder sb = new StringBuilder();
- 因此,使用var定义变量,仅仅是少写了变量类型而已。