文章目录
数据类型
- 变量指的是程序运行时可变的量. 相当于开辟一块内存空间来保存一些数据.
- 类型则是对变量的种类进行了划分, 不同的类型的变量具有不同的特性.
- 我们所讨论的 “变量” 主要和我们的 “内存” 这样的硬件设备密切相关.
冯诺依曼:现代计算机之父(大佬中的大佬)
详情点击:冯诺依曼结构计算机
输入设备:如:键盘、话筒
输出设备:如:显示屏、音响
CPU:由运算器和控制器组成
外存储器:如:优盘、硬盘、光盘(碟)
内存储器:程序(你打开的所有软件的运行程序)都在内存储器上跑,
为什么要讲这块儿呢?
是为了明白我们定义的变量要占内存,而占的内存就是内存储器上的内存,也就是说程序跑到哪里就会占用哪里的内存。
1.整型变量
基本语法格式
int 变量名 = 初始值;
代码示例:
int a = 10; // 定义一个整型变量
System.out.println(a) ;
思考3个问题:
①a占用几个字节?
②a的取值范围是多少?
③有没有无符号整型?
答:
①:a占用4个字节,在java中int就占4个字节,和多少位平台没有关系(32位/64位都占4个字节),因此可以说它的可移植性强
②: -2 31~ 231-1(-2147483648~2147483647)
③:在java当中没有无符号这样的概念,都是有符号的,如没有无符号的整数,“统统”都是有符号的。
注意事项:
- int 表示变量的类型是一个整型
- 变量名是变量的标识,也叫标识符. 后续都是通过这个名字来使用变量
- 建议创建变量的时候都要初始化.
- 在 Java 中, 一个 int 变量只占 4 个字节. 和操作系统没有直接关系.
- 在java当中,标识符由数字,字母,下划线,$ 这四种组成,但标识符能以数字开头,当然,也尽量不要以下划线、$开头和结尾,虽然合法但不太合理。
什么是字节?
字节是计算机中表示空间大小的基本单位.
计算机使用二进制表示数据. 我们认为 8 个二进制位(bit) 为一个字节(Byte).
我们平时的计算机为 8GB 内存, 意思是 8G 个字节.
其中 1KB = 1024 Byte, 1MB = 1024 KB, 1GB = 1024 MB.
所以 8GB 相当于 80 多亿个字节.
4 个字节表示的数据范围是 -2^31 -> 2^31-1 , 也就大概是 -21亿 到 +21亿
通过代码查看 Java 中的整型数据范围:
代码1:
public class testDemo1 {
public static void main1(String[] args) {
int a=10;//定义一个整型变量并初始化
System.out.println(a);
//打印int的最大最小值:
System.out.println(Integer.MAX_VALUE);//Integer是int的包装类
System.out.println(Integer.MIN_VALUE);
}
}
打印结果:
通过画图查看 Java 中的整型数据范围:在计算机的世界中,假设将整型的取值范围看成是一个圆

代码2:但如果运算的结果超出了 int 的最大范围, 就会出现溢出的情况
public static void main(String[] args) {
int maxValue=Integer.MAX_VALUE;
System.out.println(maxValue+1);//最大值+1
int minValue=Integer.MIN_VALUE;
System.out.println(minValue-1);//最小值-1
}
运行结果:

21亿这样的数字对于当前的大数据时代来说, 是很容易超出的. 针对这种情况, 我们就需要使用更大范围的数据类型来表示了,java中提供了long类型。
2.长整型变量
语法格式
long 变量名=初始值;
代码示例:
public static void main(String[] args) {
long l=10L;//定义一个长整型变量并初始化
System.out.println(l);
// 查看 Java 中的长整型数据范围:
System.out.println(Long.MAX_VALUE);//注意是Long,而不是long,Long是long的包装类
System.out.println(Long.MIN_VALUE);
}
打印结果:
从打印结果来看,这个数据范围远超过 int 的表示范围. 足够绝大部分的工程场景使用。
注意事项:
- 基本语法格式和创建 int 变量基本一致, 只是把类型修改成 long
- 初始化设定的值为 10L , 表示一个长整型的数字. 10l 也可以.
- 使用 10 初始化也可以, 10 的类型是 int, 10L 的类型是 long, 使用 10 L 或者 10 l 更好一些.
- 4.Java 中 long 类型占 8 个字节. 表示的数据范围 -2^63 ~2^63-1。
3.双精度浮点型变量
语法格式
double 变量名=初始值;
代码示例:
public static void main(String[] args) {
double d1=1.11;//定义一个double类型的变量并初始化
System.out.println(d1);
// 查看 Java 中的double数据范围:
System.out.println(Double.MAX_VALUE);//Double是double的包装类
System.out.println(Double.MIN_VALUE);
double d2=1.1;
System.out.println(d2*d2);
}
打印结果:
Java 中的 double 虽然也是 8 个字节, 但是浮点数的内存布局和整数差别很大, 不能单纯的用 2 ^ n 的形式表示数据范围。
注意:以后写代码表示小数的时候,尽量用double,可以更加精确,因为小数是没有精确的值的,如上面代码中d2的打印结果。
4.单精度浮点型变量
基本格式:
float 变量名 = 初始值;
代码示例:
public static void main(String[] args) {
float f1=11.1f;//11.1后面需要加f或F,因为java是强类型语言,一旦等号两边的类型不匹配就会报错soutsout
System.out.println(f1);
// 查看 Java 中的float数据范围:
System.out.println(Float.MAX_VALUE);//Float是Float的包装类
System.out.println(Float.MIN_VALUE);
}
运行结果:
float 类型在 Java 中占四个字节, 同样遵守 IEEE 754 标准. 由于表示的数据精度范围较小, 一般在工程上用到浮点数都优先考虑double,不推荐float。
5. 字符类型变量
基本格式:
char 变量名 = 初始值;
代码示例:
public static void main(String[] args) {
char ch1='a';
System.out.println(ch1);
char ch2=97;
System.out.println(ch2);
char ch3='嗨';//char在java中是两个字节,可以引一个汉字
System.out.println(ch3);
// 查看 Java 中的char的取值范围:
System.out.println(Character.MAX_VALUE);//Character是char的包装类
System.out.println(Character.MIN_VALUE);
}
打印结果:
注意:char类型的取值是从0开始的不能存负数,它的取值范围是0~65535(2个字节,16位)。
如:
关于字符编码方式的讨论, 参见https://zhuanlan.zhihu.com/p/35172335
6.字节类型变量
基本语法格式:
byte 变量名 = 初始值;
代码示例:
public static void main(String[] args) {
byte a=10;
byte b=20;
System.out.println(a);
System.out.println(b);
// 查看 Java 中的byte的取值范围:
System.out.println(Byte.MAX_VALUE);//Byte是byte的包装类
System.out.println(Byte.MIN_VALUE);
}
打印结果:
注意:
1.java当中的byte其实很类似于C语言中的char,它有一个字节,取值范围-128~127。
2.局部变量在使用的时候必须初始化,否则编译不能通过;
3.给任何的数据类型赋值的时候字面值是一定不能超过这种类型的取值范围的。
如:
7.短整型变量
基本语法格式:
short 变量名 = 初始值;
代码示例:
public static void main(String[] args) {
short s=1;
System.out.println(s);
// 查看 Java 中的short的取值范围:
System.out.println(Short.MAX_VALUE);//Short是short的包装类
System.out.println(Short.MIN_VALUE);
}
打印结果:
注意:
- short 占用 2 个字节, 表示的数据范围是 -32768 -> +32767
- 这个表示范围比较小, 一般不推荐使用.
8.布尔类型变量
基本语法格式:
boolean 变量名 = 初始值;
代码示例:
public static void main(String[] args) {
boolean flg1=true;
System.out.println(flg1);
boolean flg2=false;
System.out.println(flg2);
}
打印结果:
注意事项:
1.boolean 类型的变量只有两种取值, true 表示真, false 表示假.
2. 在java当中,不存在 1 表示 true, 0 表示 false 这样的用法.
3. boolean 类型JVM 的实现有些 书上写是占 1 个字节, 有些占1个比特位,这个没有明确规定。
总结:Java中的八种数据类型
简单类型/内置类型 | 包装类 | 大小(单位字节) | 取值范围 |
---|---|---|---|
int | Integer | 4 | -231~231-1 |
long | Long | 8 | -263~263-1 |
double | Double | 8 | 参考C语言浮点数的存储 |
float | Float | 4 | 参考C语言浮点数的存储 |
char | Character | 2 | 0~65535 |
byte | Byte | 1 | -128~127 |
shotr | Short | 2 | -215~215-1 |
boolean | Boolean | JVM标准并未说明 | true/false |
引用类型
字符串类型变量(重点)
基本语法格式:
String 变量名 = “初始值”;
代码示例:
public static void main(String[] args) {
String str="wasia wasai";//String是引用数据类型,str 是一个引用变量
System.out.println(str);
//1.字符串和任意类型的数据使用加号拼接后其结果也是字符串
//java中的字符串拼接格式
int a=10;
System.out.println("a="+a);
int b=30;
System.out.println("hello "+a+b);
//2.如果字符串放在后面就会先执行+操作再做字符串连接
System.out.println(a+b+"hehe");
//3.字符串中的一些特定的不太方便直接表示的字符需要进行转义
String c="hello \"哇塞哇塞\"";// 创建一个字符串 hello ”哇塞哇塞“
System.out.println(c);
}
打印结果:
字符串的 + 操作, 表示字符串拼接:
public static void main(String[] args) {
String str1="luanshizhongde";
String str2="meishen";
String str3=str1+str2;
System.out.println(str3);
}
字符串和整数进行拼接:
public static void main(String[] args) {
String str="result=";
int a=999;
int b=1;
String value=str+a+b;
System.out.println(value);
}
打印结果:
以上代码说明, 当一个 + 表达式中存在字符串的时候, 都是执行字符串拼接行为.
因此我们可以很方便的使用 System.out.println 同时打印多个字符串或数字
如:
public static void main(String[] args) {
int a=520;
int b=1314;
System.out.println("a="+a+",b="+b);
}
注意:转义字符有很多, 其中几个比较常见的如下:
转义字符 | 解释 |
---|---|
\n | 换行 |
\t | 水平制表符 |
\ ’ | 单引号 |
\ " | 双引号 |
\ \ | 反斜杠 |
变量
变量的作用域
也就是该变量能生效的范围, 一般是变量定义所在的代码块 (大括号)
【局部变量作用域】代码示例:
【变量重定义】代码示例:
如何解决重定义?
运行结果:int i=999;表示对i初始化,i=9;表示将i改为了9
注意:
1.什么是局部变量?
答:定义在函数体内的变量,
2.局部变量的作用域在它所在的这个函数的函数体内
3.如何判断局部变量是否在函数体内?
答:找花括号,即包含这个变量的花括号的开始和结束位置。
4.局部变量在使用的时候必须初始化。
变量的命名规则
硬性指标:
- 一个变量名只能包含数字, 字母, 下划线
- 数字不能开头.
- 变量名是大小写敏感的. 即 num 和 Num 是两个不同的变量.
软性指标:
1.变量命名要具有描述性, 见名知意.
2.变量名不宜使用拼音(但是不绝对).
3.变量名的词性推荐使用名词.
4.虽然语法上也允许使用中文/美元符($)命名变量, 但是 强烈 不推荐这样做
5.变量的命名,建议采用小驼峰命名法。
疑问:
什么是大驼峰?
当一个变量名由多个单词构成的时候, 每个单词的首字母都大写
什么是小驼峰?
当一个变量名由多个单词构成的时候, 除了第一个单词之外, 其他单词的首字母都大写
代码示例:
public static void main(String[] args) {
//小驼峰命名示例
int maxNum=11;
String studengAge="20";
System.out.println(maxNum);
System.out.println(studengAge);
//大驼峰命名示例
int MaxNum=12;
System.out.println(MaxNum);
}
打印结果:
什么时候使用小驼峰,什么时候使用大驼峰?
小驼峰 | 大驼峰 |
---|---|
变量的命名 | 类名 |
方法的名称 | 接口 |
抽象类 |
常量
上面讨论的都是各种规则的变量, 每种类型的变量也对应着一种相同类型的常量.
常量指的是运行时类型不能发生改变.
常量主要有以下两种体现形式:
1.字面值常量
10 // int 字面值常量(十进制)
010 // int 字面值常量(八进制) 由数字 0 开头. 010 也就是十进制的 8
0x10 // int 字面值常量(十六进制) 由数字 0x 开头. 0x10 也就是十进制的 16
10L // long 字面值常量. 也可以写作 10l (小写的L)
1.0 // double 字面值常量. 也可以写作 1.0d 或者 1.0D
1.5e2 // double 字面值常量. 科学计数法表示. 相当于 1.5 * 10^2
1.0f // float 字面值常量, 也可以写作 1.0F
true // boolen 字面值常量, 同样的还有 false
'a' // char 字面值常量, 单引号中只能有一个字符
"abc" // String 字面值常量, 双引号中可以有多个字符.
2. final 关键字修饰的常量
C语言中修饰常量的关键字为const,而Java中修饰常量的关键字为final.
代码示例:
建议:由final修饰的变量建议大写,易于区分。
如:
public static void main(String[] args) {
final int NUM;
NUM=20;
System.out.println(NUM);
}
提示:final 不仅可以修饰变量,还可以修饰函数,修饰类,修饰函数把它叫做密封方法,修饰类把它叫做密封类。
理解类型转换
Java 作为一个强类型编程语言, 当不同类型之间的变量相互赋值的时候, 会有教严格的校验。
代码示例:int 和 long/double/float 相互赋值
结论: 不同数字类型的变量之间赋值, 表示范围更小的类型能隐式转换成范围较大的类型, 反之则不行。
如何解决呢?需要强制类型转换。
代码示例:int 和 boolean 相互赋值
结论:int 和 boolean 是毫不相干的两种类型, 不能相互赋值,也不能强制类型转换.
类型的转换要注意:
- 注意等号两边的数据类型的字节大小,以及表示的数字的宽度(如float可以表示整数也可表示小数,而int只能表示整数)。
- boolean类型不能和任何其他的数据类型之间进行转换。
- .强制类型转换可能会导致精度丢失,小数点后面的部分会被忽略。
- .强制类型转换不是一定能成功, 互不相干的类型之间无法强转.
代码示例:int字面值常量 给 byte 赋值
注意: byte 表示的数据范围是 -128 -> +127, 256 已经超过范围, 而 100 还在范围之内
结论: 使用字面值常量赋值的时候, Java 会自动进行一些检查校验, 判定赋值是否合理.
类型转换总结
- 不同数字类型的变量之间赋值, 表示范围更小的类型能隐式转换成范围较大的类型.
- 如果需要把范围大的类型赋值给范围小的, 需要强制类型转换, 但是可能精度丢失.
- 将一个字面值常量进行赋值的时候, Java 会自动针对数字范围进行检查.
理解数值提升
疑问:为什么e变量可以编译通过呢?
答:因为a,b是变量,变量只有程序运行的时候才能知道a,b里面放的是几;而e=10+20java在编译的时候就已经算出为30了,相当于是一个常量,即byte e=10+20;相当于byte e=30;
结论:
- byte 和 byte 都是相同类型, 但是出现编译报错. 原因是, 虽然 a 和 b 都是 byte, 但是计算 a + b 会先将 a 和 b 都
提升成 int, 再进行计算, 得到的结果也是 int, 这是赋给 c, 就会出现上述错误. - 由于计算机的 CPU 通常是按照 4 个字节为单位从内存中读写数据. 为了硬件上实现方便, 诸如 byte 和 short 这种低于4 个字节的类型, 会先提升成 int, 再参与计算.
int 和 long 混合运算
结论:当 int 和 long 混合运算的时候, int 会提升成 long, 得到的结果仍然是 long 类型, 需要使用 long 类型的变量来
接收结果. 如果非要用 int 来接收结果, 就需要使用强制类型转换.
类型提升小结:
- 不同类型的数据混合运算, 范围小的会提升成范围大的.
- 对于 short, byte 这种比 4 个字节小的类型, 会先提升成 4 个字节的 int , 再运算.
int 和 String 之间的相互转换
代码示例:
public static void main(String[] args) {
int a=55;
String str1=a+"";
System.out.println(str1);//55 , 但这里的55是一个字符串
String str2=String.valueOf(a);//String.valueOf(a)的作用是把a变成一个字符串
System.out.println(str2);//55, 这里的55是一个字符串
String str="999";
int num = Integer.parseInt(str);//Integer.parseInt(str)的作用是把字符串str变成一个整数,也可使用 Integer.valueOf
System.out.println(num);//999, 但这里的999是一个整数
}
了解valueOf的使用可查询