Java基础知识之了解变量、常量,掌握数据类型,类型转换,数值提升,int和String相互转换
一、变量和类型概念
变量指的是程序运行时可变的量。相当于开辟一块内存空间来保存一些数据。
类型则是对变量的种类进行了划分, 不同的类型的变量具有不同的特性。
其中, “变量” 主要和 “内存” 这样的硬件设备密切相关,如下图所示:
Java 的数据类型有基本数据类型和引用数据类型:
二、变量
(1)变量的作用域
指该变量能生效的范围,一般是变量定义所在的代码块,如下列代码所示int在括号中被定义,括号外面则不能对其操作:
public class TestDay {
public static void main(String[] args) {
{
int m =30;
}
System.out.println(m);//编译报错
}
}
(2)命名规则
- 一个变量名只能包含数字, 字母, 下划线,数字不能开头。
- 变量名区分大小写,即 Sum 和 sum 是两个不同的变量。
注意:虽然语法上也允许使用中文/美元符($)命名变量, 但是强烈 不推荐这样做。 - 变量命名要具有描述性, 见名知意;变量名不宜使用拼音;变量名的词性推荐使用名词。
- 变量命名推荐“小驼峰”命名法, 当一个变量名由多个单词构成的时候, 除了第一个单词之外, 其他单词首字母都大写,小驼峰命名示例如下:
int maxValue = 100;
String studentAge = "23";
三、常量
java中每种类型的变量对应着一种相同类型的常量。
常量指的是运行时类型不能发生改变。
常量主要有种体现形式,字面值常量和 final 关键字修饰的常量。
(1)字面值常量
18 // int 字面值常量(十进制)
022 // int 字面值常量(八进制) 由数字 0 开头. 022 也就是十进制的 18
0x12 // int 字面值常量(十六进制) 由数字 0x 开头. 0x12 也就是十进制的 18
18L // long 字面值常量. 也可以小写l
18.0 // double 字面值常量. 也可以写作 18.0d 或者 18.0D
2.5e3 // double 字面值常量. 科学计数法表示. 相当于 2.5 * 10^3
1.0f // float 字面值常量, 也可以大写F
true // boolen 字面值常量, 同样的还有 false
'a' // char 字面值常量, 单引号中只能有一个字符
"abc" // String 字面值常量, 双引号中可以有多个字符.
(2)final 关键字修饰的常量
常量不能在程序运行过程中发生修改,如下代码返回的编译错误是无法为最终变量m分配值:
final char m = 'a';
char m = 20;
结果错误显示:
四、java中的数据类型
1 整型变量(重点)
(1) 基本语法格式:
int 变量名 = 初始值;
代码表示如下:
int a = 50;//定义整型变量
System.out.println(a);
注:
- Java 中 “= ”表示赋值, 意思是给变量设置一个初始值。
- 建议创建变量的时候显式初始化。
- 在 Java 中, 一个 int 变量占 4 个字节. 和操作系统没有直接关系。
字节是计算机中表示空间大小的基本单位。计算机中一个字节为8个二进制位。
其中 1KB = 1024 Byte, 1MB =1024 KB, 1GB = 1024 MB。
8GB 相当于 80 多亿个字节。
(2)4 个字节表示的数据范围是 -2^31-> 2^31-1 ,求int数据范围如下代码所示:
public static void main(String[] args) {
//求int的最大、最小值
System.out.println(Integer.MAX_VALUE);
System.out.println(Integer.MIN_VALUE);
}
运行结果如下:
如果运算结果超出 int 最大范围, 就会出现溢出的情况。如下代码所示:
int max = Integer.MAX_VALUE;
System.out.println(max+1);
int min = Integer.MIN_VALUE;
System.out.println(min-1);
运行结果如下:
2 长整型变量
(1)基本语法格式:
long 变量名 = 初始值;
代码表示如下:
long m = 6L; //定义长整型变量,大小写都可
System.out.println(m);
(2)求Java中long数据范围如下代码所示:
System.out.println(Long.MAX_VALUE);
System.out.println(Long.MIN_VALUE);
运行结果如下:
3 浮点型变量
浮点型分为双精度double和单精度folat,其中双精度数double是重点掌握。
(1)双精度浮点型变量的基本语法格式:
double 变量名 = 初始值;
代码表示如下:
double m = 2.3;
System.out.println(m);
(2)双精度浮点型变量(重点)
在整型类型中,int值处以int值的结果仍然是int,所以会舍弃小数部分,如下面的代码两个int值相除,得到的结果是0。如果想到得到结果0.5,则需要使用double类型计算。代码如下:
int m = 3;
int n = 6;
System.out.println(m/n);//运行结果为0
double a = 3.0;
double b = 6.0;
System.out.println(a/b);//运行结果为0.5
Java 中 double 是 8 个字节, 但是浮点数的内存布局和整数差别很大,不能单纯的用 2 ^ n 的形式表示数据范围。如下列代码表示两个double数相乘:
double m = 2.2;
System.out.println(m * m)
运行结果如下:
Java 的 double 类型的内存布局遵守 IEEE 754 标准(和C语言一样),尝试使用有限的内存空间表示可能无限的小数, 势必会存在一定的精度误差。
(3)单精度浮点型变量的基本语法格式:
float 变量名 = 初始值;
代码表示如下:
float m = 2.3f;
System.out.println(m);
Java的float 类型占四个字节,遵守 IEEE 754 标准。由于表示的数据精度范围较小,一般在工程上用到浮点数都优先考虑 double, 不太推荐使用 float。
4 字符类型变量
基本语法格式:
char 变量名 = 初始值;
代码表示如下:
char ch = 'H';//Java 中使用单引号+ 单个字母的形式表示字符字面值。
System.out.println(ch);
5 字节类型变量
(1)基本语法格式:
byte 变量名 = 初始值;
代码表示如下:
byte m = 3;
System.out.println(m);
(2)字节类型表示整数,占一个字节。字节类型和字符类型互不相干,字节类型表示范围如下代码所示:
System.out.println(Byte.MAX_VALUE);//运行结果:127
System.out.println(Byte.MIN_VALUE);//运行结果:-128
6 短整型变量
(1)基本语法格式:
short 变量名 = 初始值;
代码表示如下:
short m = 0;
System.out.println(m);
(2)short 占两个字节, 表示的范围如下代码,因为范围比较小, 一般不推荐使用。
System.out.println(Short.MAX_VALUE);//运行结果:32767
System.out.println(Short.MIN_VALUE);//运行结果:-32768
7 布尔类型变量
(1)基本语法格式:
boolean 变量名 = 初始值;
(2)boolean 类型的变量只有两种取值,true 表示真,false 表示假。
Java 的 boolean 类型和 int 不能相互转换, 即不存在 1 表示 true, 0 表示 false 这样的用法。如下所示不能进行运算:
boolean m = true;
System.out.println(m + 1);
代码编译会出现错误:
boolean 类型有些 JVM 的实现是占 1 个字节, 有些是占 1 个比特位, 没有明确规定。
8 字符串类型变量(重点)
(1)基本语法格式:
String 变量名 = “初始值”;
代码表示如下:
String m = "blue";
System.out.println(m);//运行结果:blue
(2)java中使用“双引号”+若干字符的方式表示字符串的字面值。String不是基本类型,而是引用类型,下面有讲述到。
(3)字符串中的一些特定的不能直接表示的字符需要转义字符。如下代码所示:
String m = "反斜杠的表示是\\";//
String n = "我的名字是\"sendy\"";
System.out.println(m);
System.out.println(n);
运行结果:
常见的转义字符有:
转义字符 | 表示 |
---|---|
\’ | 单引号 |
\" | 双引号 |
\\ | 反斜杠 |
\n | 换行 |
\t | 水平制表符 |
(4)字符串的拼接使用“+”操作,如下:
String X = "千树";
String Y = "万树";
String Z = "梨花开";
String n = "。";
String m = X + Y + Z + n;
System.out.println(m);//运行结果:千树万树梨花开。
同时,还可以用字符串和整数进行拼接,如下代码所示:
int a = 2;
int b = 4;
String m = "splicing = ";
String n = m + a + b;
System.out.println(n);//运行结果:sum = 24
五、类型转换
Java 作为一个强类型编程语言, 当不同类型之间的变量相互赋值的时候, 会有严格的校验。
int 和 long/double 相互赋值:
int a = 2;
long b = 3;
a = b; // 编译出错,long表示的范围比int大,不能将long赋值给int。
b = a; // 编译通过。
int m = 20;
double n = 1.0;
m = n; // 编译出错,double表示的范围比int大,不能将double赋值给int。
n = m;//编译通过。
结果错误显示:
结论:不同数字类型的变量之间赋值, 表示范围更小的类型能隐式转换成范围较大的类型, 反之则不行。
int 和 boolean 相互赋值:
int m = 10;
boolean n = true;
m = n; // 编译出错,提示不兼容的类型:int无法转换为boolean
n = m; // 编译出错, 提示不兼容的类型:boolean无法转换为int
结论:int 和 boolean 不能相互赋值。
int字面值常量给byte赋值:
byte 数据范围是 -128 -> +127,如下代码,127在byte范围内,但是128超过范围:
byte a = 127; // 编译通过
byte b = 128; // 编译报错
错误结果显示:
结论:使用字面值常量赋值的时候, Java 会自动进行一些检查校验, 判定赋值是否合理。
使用强制类型转换
int a = 3;
double b = 34.9;
a = (int)b;//使用 (类型) 的方式可以将 double 类型强制转成 int。
int m = 2;
boolean n = false;
n = (boolean)m;//编译出错,提示不兼容的类型:int无法转换为boolean。
结论:1.强制类型转换可能会导致精度丢失。如上面例子中, 赋值之后, 34.9 就变成 34, 小数点后面的部分被忽略。
2. 强制类型转换不是一定能成功, 互不相干的类型之间无法强转,如上述int与boolean类型。
类型转换小结
- 不同数字类型的变量之间赋值, 表示范围更小的类型能隐式转换成范围较大的类型。
- 如果需要把范围大的类型赋值给范围小的, 需要强制类型转换, 但是可能精度丢失。
- 将一个字面值常量进行赋值的时候, Java 会自动针对数字范围进行检查。
六、数值提升
int 和 long 混合运算
当 int 和 long 混合运算的时候,int 会提升成 long, 得到的结果仍然是 long 类型, 需要使用 long 类型的变量来接收结果,如果使用int类型变量接收则会编译报错,如下代码所示:
int a = 1;
long b = 2;
int c = a + b; // 编译出错, 提示:从 long 转换到 int 可能会有损失
long d = a + b; // 编译通过.
如果非要用 int 来接收结果, 就需要使用强制类型转换,如下图:
byte 和 byte 的运算
byte 和 byte 都是相同类型, 但是出现编译报错。如下代码所示 ,m 和 n 都是 byte, 但是计算 m + n 会先将 m 和 n 都提升成 int, 再进行计算, 得到的结果也是 int, 再赋给 a, 就会出现编译错误:
byte m = 23;
byte n = 22;
byte a = m + n;
System.out.println(a);
编译错误显示:
正确写法,将m和n的结果先转换为byte类型再赋给a,如下:
结论:
由于计算机的 CPU 通常是按照 4 个字节为单位从内存中读写数据。 为了硬件上实现方便, 诸如 byte 和 short 这种低于4 个字节的类型, 会先提升成 int, 再参与计算。
类型提升小结:
- 不同类型的数据混合运算, 范围小的会提升成范围大的。
- 对于 short, byte 这种比 4 个字节小的类型, 会先提升成 4 个字节的 int , 再运算。
七、int 和 String 之间的相互转换
(1)int 转成 String
有两种方法实现:
int m = 23;
String str1 = m + "";// 方法1
String str2 = String.valueOf(m);//方法2
(2)String 转成 int
有两种方法实现:
1)Integer.parseInt(String)方法
parseInt()是Integer包装类里的方法,可以将字符串解析为带符号的整数。
String str = "23";
int m = Integer.parseInt(str);
m += m;
System.out.println(m);
运行结果:
在parseInt()方法中,字符串中除第一个可以是负号,其他必须是数字,如下所示str1的值会转换变量str1进行运算:
String str1= "-23";
int m = Integer.parseInt(str1);
m += m;
System.out.println(m);
运行结果:
反之,如果字符串里的字符部分是数字,则Integer.parseInt()将会抛出一个异常(数字格式异常),如果将上面程序字符串str1的值改为“-23ab”,则会出现编译报错:
2)Integer.valueOf(String)方法
valueOf()也是Integer包装类里的方法,可以将String类型的值转换为int类型值。和parseInt(String)方法相同的是字符串中除第一个可以是负号,其他必须是数字。
它两的区别在于parseInt(String)方法返回原始的int值,valueOf(String)方法会返回Integer类的对象。
String str1= "-23";
int m = Integer.valueOf(str1);
m *= m;
System.out.println(m);
运行结果: