今天重温了一遍Java SE基础——变量和数据类型,发现以前学习的的确是不够系统啊,,在学习中收获颇丰,之前学习中在数据类型的强制类型转换学习中只了解个大概,今天最大的收获就是在 强制类型转换(自动转换也有很多收获!)以及 表达式的自动提升这两部分的知识,这些基础知识也是我们学习一门语言的常识,掌握它们对以后的开发会有很大的帮助。下面我们就来学习基本数据类型和变量把。
1.变量
变量的定义格式
数据类型 变量名称 = 初始值
注意:
- 变量名称,首字母要求小写,满足“驼峰模式”(后面单词首字母大写)。
- 初始值,定义的时候可有可无。在使用的时候有一些注意事项,涉及到一些其他知识,之后我会出一篇详细文章咱探讨个究竟!!
2. 数据类型
2.1 数据类型分类(熟练掌握)
涉及到一门语言最基本的数据类型肯定是要熟练掌握的啦!
Java 的数据类型分为两大类: 基本数据类型,引用数据类型。
- 基本数据类型(四大类八种):整型、浮点型、字符型、布尔型。
- 整型:表示的是整数。分为字节型byte、短整型short、整型 int 、长整型long。
- 浮点型:表示的是小数。包括单精度浮点数 float,双精度浮点数 double(默认)。
- 字符型:表示的是单个字符,类型只有一个char。
- 布尔型:类型是boolean,其值只有 false 和 true 两种情况。
- 引用数据类型: 包括类、数组、接口、字符串。这个在学面向对象的时候会具体来说。
2.2 基本数据类型详细列表
数据类型 | 关键字 | 内存占用 | 取值范围 |
---|---|---|---|
字节型 | byte | 1个字节 | -128~127 |
短整型 | short | 2个字节 | -32768~32767 |
整型 | int(整型) | 4个字节 | 记住大概21亿就行 |
长整型 | long | 8个字节 | -2的63次方~2的63次方减一 |
单精度浮点数 | float | 4个字节 | -3.4E38~3.4E38 |
双精度浮点数 | double | 8个字节 | -1.7977E308~1.7977E308 |
字符型 | char | 2个字节 | 0-65535 |
Java 中的默认类型:整数类型是 int,浮点型是 double。
2.3 注意点
- long类型:随便写一个整数,默认是int类型的,如果希望随便写一个整数默认是long型的必须在数据后加L或者l表示。
- float类型:随便写一个小数,默认是double类型的,如果希望这个小数是float类型的,必须在数据后加F或者f表示。
2.4 数据类型的区别
- 4种整形的存储数据范围和占据内存区域的大小是不一样的,从上节中的数据类型列表可以看出byte类型的变量能存储的数据大小范围是-128~127,底层需要占1个字节。short -> int -> long 范围依次变大,严格来说我们如果存储的数据不是很大的时候,是可以选择适合的数据类型的,但是按照习惯程序员习惯是都是默认使用int类型的变量存放整数的,如果需要存储特别大的整数数据可以选择long类型的变量。
- 对于小数的存储,float类型的范围也是小于double类型的,通常按照开发习惯我们都会采用double类型的变量来存放小数进行程序开发。
变量和基本数据类型小结
- 同一个方法不能定义两个同名的变量。
- 作用域问题:变量只在定义时的{ }中有效,从开始定义到 } 结束。
- Java 是强类型的编程语言,变量必须先定义才可以使用。
- 随便写一个整数,默认是 int 类型的,如果希望随便写一个整数默认是 long 型的必须在数据后加L或者l表示。随便写一个小数,默认是double类型的,如果希望这个小数是float类型的,必须在数据后加F或者f表示。
- 通常定义整数采用int类型 , 定义小数采用double类型。
3. 数据类型转换 (好好学!)
3.1 为什么要进行数据类型转换?
Java程序中要求参与计算的数据,必须要保证数据类型统一成一致,才可以参与运算,如果数据类型不一致将发生类型的转换。所以数据类型之间的转换是有必要的。
数据类型转换非为 自动类型转换和 强制类型转换。
3.2 自动类型转换
3.2.1 常量赋值给变量
int i = 1;
// 自动类型转换: 1.随便写一个整数, 如果它的范围在变量的范围之内是可以直接赋值给该类型的变量。
byte b = 12;
//byte b = 1299; // 报错
System.out.println(b);
3.2.2 自动类型转换(小范围可自动转换为大范围的)
取值范围小的类型
可以自动转换为取值范围大的类型
。也就是小范围变量到大范围变量是自动转换的. 满足:
byte->short->int->long->float->double,其中 char 类型 的变量可以直接自动转换给 int 类型的变量。。int 类型范围大于 char类型。
public static void main(String[] args){
// 自动类型转换: 小范围类型的变量可以自动转换给大范围类型的变量。
byte b1 = 14;
int age = b1;
System.out.println(age);
int s = 23819;
long lg = s;
System.out.println(lg);
long lg1 = 12773849; // 这里没有加 L ,其实默认的是 int 类型。
double db = lg1;
System.out.println(db);
// 拓展:
// 自动类型转换: 小范围类型的变量可以自动转换给大范围类型的变量。
// char是编号,但是字符编号的范围是有限的相对于 int 类型来说
// 是小范围的,所以可以自动转换。
char ch = '中';
int it = ch ;
System.out.println(it); // 就是 '中'在底层的编号
}
}
3.3 强制类型转换
3.3.1 为什么要进行强制类型转换?
上面 小范围变量 —> 大范围变量 可以实现自动类型变换。(下意识想一下也是可以理解的啦)
但是 大范围变量 到 小范围变量 要转换肯定是要丢失精度的。如果我们直接把 200 赋值给 byte 类型,肯定会编译失败。
byte i = 200; // 编译出错,丢失精度
byte类型的范围是 -127到128 之间,200已经超过了 byte 类型变量可以存储的数据范围大小。想要赋值成功,只有通过强制类型转换,将 int 类型的200进行强制转换成 byte类型才能赋值。
- 强制类型转换:将 取值范围大的类型 强制转换成取值范围小的类型。也就是把大范围类型的数据或者大范围的类型变量赋值给小范围的类型变量必须要强制类型转换否则代码报错。 比较而言,自动转换是Java自动执行的,而强制转换需要我们自己手动执行。(范围相对级上面有!)
3.3.2 强制类型转换的格式
数据类型 变量名 = (数据类型)被转数据值;
将 200 赋值给 byte类型,
byte i = (byte)200;
System.out.println(i); //数据会出现变化,结果数值是数据溢出后的结果。
// 浮点转成整数,直接截断小数点,保留整数部分,可能造成数据损失精度。
double db = 23.98;
int it = (int)db ;
System.out.println(it);// 23
}
3.3.3 注意事项与小结
- 浮点型转成整型,直接截断小数点,保留整数部分,可能造成数据损失精度。
- 大范围类型的变量 强制转成 小范围类型的变量,可能造成数据丢失。
int s = 32777; // 定义s为 short 范围内最大值
// 运算后,强制转换可造成数据丢失。
byte bt = (byte)s;
3.4 表达式的自动类型提升
数据类型在表达式中参与运算时将满足一定的转换规则。
3.4.1 转换规则
1. 范围小的类型向范围大的类型提升, byte、short、char
运算时直接提升为 int
的。
byte、short、char-->int-->long-->float-->double
2. 表达式的最终类型由表达式中的最高类型决定。 (最实在的规则!!!)
public static void main(String[] args){
byte bt = 10 ;
int age = 100 ;
long lg = 1000;
long rs = bt + age * lg ;
System.out.println(rs);
// 面试题。
byte b1 = 10 ;
short b2 = 10 ;
//short b3 = b1 + b2 ; // 错误的 b1 b2升级成了int类型
//short b3 = (short)(b1 + b2) ; // 可以的 int -> short 强转
int b3 = b1 + b2 ;
System.out.println(b3);
float ft1 = 10.0f;
double db1 = 1 ;
long lg1 = 10 ;
char ch = 'a';
// char类型的变量ch在参数运算的时候会自动转成int类型的整数97.
double d1 = ft1*db1*lg1*ch;
System.out.println(d1);
}
3. byte, short, char类型的变量在参与运算的时候会直接升级成 int 类型参与运算(针对于表达式)。
public static void main(String[] args){
byte b1 = 1;
byte b2 = 2;
byte b3 = 1 + 2; // **常量3**在 byte 范围之类是可以自动转换的。
byte b4 = b1 + b2; // 这里报错了,b1 和b2 会自动提升成 int 类型变量运行,结果是 int类型的。
System.out.println(b3);
System.out.println(b4);
}
3.4.2 小结
我们可以得到表达式中两条黄金定律:
- 表达式的最终结果类型由表达式中的最高类型决定。
- byte ,short, char 类型的 变量 在参与运算的时候会直接升级成 int 类型参与运算(针对于表达式)。(Tips :类似上面例子,右边式子是要提升到 int 类型的,不过我们可以强转一下。 )
3.5 ASCII编码
public static void main(String[] args) {
//字符类型变量
char c = 'a';
int i = c + 1;
//字符类型和int类型转换
System.out.println(i);//输出结果是98
}
我们只需要记住几个常用的字符对应的十进制数就可以了. ‘0’ ----- 48 ; ‘9’ --------- 57 ; ‘A’------ 65 ; ‘a’-----97 ; ‘z’ ------- 122。
个人总结收获
- 基本数据类型 (四大类八种必须掌握),以后任何程序都离开变量和基本数据类型的!!(字节整型 byte不要忘记!)
- 随便写一个整数, 如果它的范围在变量的范围之内是可以直接赋值给该类型的变量。
-
- long类型:随便写一个整数,默认是int类型的,如果希望随便写一个整数默认是long型的必须在数据后加L或者l表示。
- float类型:随便写一个小数,默认是double类型的,如果希望这个小数是float类型的,必须在数据后加F或者f表示。
- 自动类型转换: 小范围类型的变量可以自动转换给大范围类型的变量。
- byte->short->int->long->float->double,其中 char 类型 的变量可以直接自动转换给 int 类型的变量。。int 类型范围大于 char类型。
- 强制类型转换:将 取值范围大的类型 强制转换成取值范围小的类型。也就是把大范围类型的数据或者大范围的类型变量赋值给小范围的类型变量必须要强制类型转换否则代码报错。 比较而言,自动转换是Java自动执行的,而强制转换需要我们自己手动执行。
- 表达式的最终类型由表达式中的最高类型决定。(灰常重要!!)
- 范围小的类型向范围大的类型提升,
byte、short、char
运算时直接提升为int
的。(易出错!) - byte, short, char类型的变量在参与运算的时候会直接升级成 int 类型参与运算(针对于表达式)。