首先,因为变量要保存数据,因此需要一块空间来存储,而这块空间就在“内存”上。
其次,变量必须先定义,再被赋值或者让初始化,才能被使用。
那么在JAVA中,变量有哪些形态呢?
※在JAVA中没有无符号类型!!!
以及数据有哪些类型呢?
那么,下面就来一一介绍一下这些类型。
1.
整型变量
•基本语法格式:
int 变量名 = 初始值;
初始化操作是
可选的
,
但是
建议
创建变量的时候都显式初始化
。
•在 Java
中
,
一个
int
变量占
4 个字节
,
和操作系统没有直接关系。
而 4 个字节表示的数据范围是
-2^31 -> 2^31-1
,
也就大概是
-21亿 到 +21亿
。
•可通过以下代码查看 Java
中的整型数据范围
:
System.out.println(Integer.MAX_VALUE); // int 的最大值
System.out.println(Integer.MIN_VALUE); // int 的最小值
※如果运算的结果超出了 int 的最大范围,就会出现溢出的情况。
// Integer 是int的包装类,'.'相当于"的"。
int maxValue = Integer.MAX_VALUE;
System.out.println(maxValue+1);
int minValue = Integer.MIN_VALUE;
System.out.println(minValue-1);
2.长整型变量
•基本语法格式:
long 变量名 = 初始值;
例如:
long num = 10L;
初始化设定的值为 10L,表示一个长整型的数字,10l 也可以。使用 10 初始化也可以,10 的类型是 int,10L 的类型是 long,使用 10 L 或者 10 l 更好一些。
•Java 中 long 类型占 8 个字节。表示的数据范围 -2^63 -> 2^63-1
•我们依然可以使用以下代码查看 Java
中的长整型数据范围
:
System.out.println(Long.MAX_VALUE);
System.out.println(Long.MIN_VALUE);
// 运行结果
9223372036854775807
-9223372036854775808
这个数据范围远超过 int 的表示范围,足够绝大部分的工程场景使用。
3.
双精度浮点型变量
•基本语法格式:
double 变量名 = 初始值;
•
在 Java 中,
int
除以
int
的值仍然是
int(
会
直接舍弃
小数部分
);如果想得到
带小数的结果
,
需要使用
double
类型计算。
•Java 中的 double
虽然也是
8 个字节,
但是
浮点数的内存布局
和整数差别很大,
不能单纯的用
2 ^ n
的形式表示数据范围。Java 的
double
类型的内存布局依然遵守
IEEE 754 标准
(
和
C
语言一样
),
尝试使用有限的内存空间表示可能无限的小数,
势必会
存在一定的精度误差
。
4.
单精度浮点型变量
•基本格式:
float 变量名 = 初始值;
•float 类型在
Java
中占
四个字节,
同样
遵守 IEEE 754 标准。
由于表示的数据
精度范围较小
,
一般在工程上用到浮点数都
优先考虑 double,
不太推荐使用
float。
5.
字符类型变量
•基本格式:
char 变量名 = 初始值;
•
Java 中使用
单引号 + 单个字母
的形式表示字符
字面值
。
•计算机中的字符
本质上
是一个
整数
,
在
C
语言中使用
ASCII
表示字符;
而
Java 中
使用
Unicode
表示字符,
因此一个字符占用
两个字节,
表示的字符
种类更多
,
包括中文。
char ch = 'A';
char ch = '呵';
System.out.println(ch);
6.字节类型变量
•基本语法格式:
byte 变量名 = 初始值;
•
字节类型表示的
也是整数。
只占
一个字节,
表示范围较小
(
-128 ~ +127
)。
•字节类型和字符类型
互不相干
。
7.
短整型变量
•基本语法格式:
short 变量名 = 初始值;
•short
占用
2 个字节,
表示的数据范围是
-32768 -> +32767。
•这个表示范围比较小,
一般不推荐使用。
8.
布尔类型变量
•基本语法格式:
boolean 变量名 = 初始值;
•boolean
类型的变量
只有两种取值,
true
表示真,
false
表示假。
•Java 的
boolean
类型和
int
不能
相互转换,
不存在
1
表示
true,0
表示
false
这样的用法。
•boolean 类型有些
JVM 的实现是占 1 个字节
,
有些是占
1
个比特位,
这个没有明确规定。
※
字符串类型变量
•基本语法格式:
String 变量名 = "初始值";
•Java
使用
双引号 + 若干字符
的方式表示字符串
字面值
。
•和上面的类型不同
, String
不是
基本类型
,
而是
引用类型。
•字符串中的一些特定的不太方便直接表示的字符需要进行转义。转义字符示例:
// 创建一个字符串 My name is "张三"
String name = "My name is \"张三\"";
转义字符有很多
,
其中几个比较常见的如下
:
转义字符 | 解释 |
\n | 换行 |
\r | 回到行首 |
\t | 水平制表符 |
\' | 单引号 |
\" | 双引号 |
\\ | 反斜杠 |
•字符串的
+ 操作,
表示
字符串拼接
:
String a = "hello";
String b = "world";
String c = a + b;
System.out.println(c);
•还可以将字符串和整数进行拼接:
String str = "result = ";
int a = 10;
int b = 20;
String result = str + a + b;
System.out.println(result);
// 执行结果
result = 1020
※变量的作用域
也就是该变量
能生效的范围
,
一般是变量定义所在的
代码块 (大括号)
。举个例子:
class Test {
public static void main(String[] args) {
{
int x = 10;
System.out.println(x); // 编译通过;
}
System.out.println(x); // 编译失败, 找不到变量 x.
}
}
class Test {
public static void main(String[] args) {
{
int x = 10; // 这里定义了一个变量 x,类型是 int,值是 10
System.out.println(x); // 会打印 10
}
{
double x = 20.0; // 这里又定义了一个变量 x,类型是 double,值是20.0
// 和上面的变量完全无关,只是用到的符号(变量名)相同
※变量的命名规则
•硬性指标:
1.
一个变量名
只能包含
数字,
字母,
下划线;
2.
数字
不能
放
开头;
3.
变量名是大小写敏感的,
即
num
和
Num
是两个不同的变量。
注:
虽然语法上
允许
使用中文
/
美元符
($)
命名变量,
但是
不推荐 使用。
•软性指标:
1.
变量命名要具有描述性,
见名知意;
2.
变量名不宜使用拼音
(
但是不绝对
);
3.
变量名的词性推荐使用名词;
4.
变量命名推荐
小驼峰命名法
(
当一个变量名由多个单词构成的时候,
除了第一个单词之外,
其他单词首字母都大写)。
※字面量和常量
•字面值:
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
字面值常量
,
双引号中可以有多个字符
•final 关键字修饰的常量,常量
不能
在
程序运行过程中
发生
修改
。
※类型转换
Java
作为一个
强类型
编程语言,
当不同类型之间的变量相互赋值的时候,
会有教严格的校验。因此,
不同
数字类型
的变量之间赋值,表示范围
更小的
类型
能隐式转换
成
范围较大的
类型,
反之则不行。
但
int 和
boolean
是毫不相干的两种类型,
不能
相互赋值。还有在 int 字面值常量 给
byte
赋值时,因为 byte 表示的数据范围是:
-128 -> +127,因此在赋值时必须考虑范围问题。
※使用强制类型转换
int a = 0;
double b = 10.5;
a = (int)b;
int a = 10;
boolean b = false;
b = (boolean)a; // 编译出错,提示不兼容的类型。
•使用
(类型)
的方式可以将
double
类型强制转成
int。
但是强制类型转换可能会导致
精度丢失。
•强制类型转换
不是一定能成功,
互不相干的类型之间
无法
强转。
※数值提升
•当 int
和
long
混合运算的时候,
int
会
提升
成
long,
需要使用
long
类型的变量来接收结果。如果非要用
int
来接收结果,
就需要
使用强制类型转换
。
•byte
和
byte
都是相同类型,
但是出现编译报错。这是因为计算时会
先将 byte类型
都
提升
成
int类型
再进行计算,
得到的
结果也是 int
。
这是由于计算机的 CPU
通常是
按照 4 个字节为单位
从内存中读写数据,
为了硬件上实现方便,
像
byte
和 short 这种
低于
4
个字节的类型,
会先提升
成
int,
再参与计算。
※ int 和 String 之间的相互转换(类比方法!)
•int 转成
String:
int num = 10;
//方法1
String str1 = num + "";
//方法2
String str2 = String.valueOf(num);
•String 转成
int:
String str = "100";
int num = Integer.parseInt(str);
※打印输出
System.out.println(msg); // 输出一个字符串, 带换行
System.out.print(msg); // 输出一个字符串, 不带换行
System.out.printf(format, msg); // 格式化输出(和C语言的printf的用法基本一致)
System.out.format(format, msg); // 完全等同于 printf
※运算符
名称 | 内容 |
赋值运算符 | = |
算数运算符 | + - * / (0不能作为除数) % += -= *= /= %= ++ (如果取表达式的返回值,则前置自增的返回值是自增之后的值,后置自增的返回值是自增之前的值) -- |
关系运算符 | == != < > <= >== |
逻辑运算符 | && || ! (返回值都是boolean) |
位运算符 | & | ~ ^ |
移位运算符 | << (最左侧位不要了,最右侧补0.左移N位相当于原数字*2的N次方) >> (最右侧位不要了,最左侧补符号位.右移N位,相当于原数字/2的N次方) >>> (无符号右移:最右侧位不要了,最左侧补0) |
条件运算符 | 表达式1 ? 表达式2 : 表达式3 |
•
&& 和 ||
遵守
短路求值
的规则:
1.
对于
&&,
如果
左侧
表达式值
为false,
则表达式的整体的值一定是
false,
无需计算右侧
表达式。
2.
对于
||,
如果
左侧
表达式值
为true,
则表达式的整体的值一定是
true,
无需计算右侧
表达式。
&
和
| (
不推荐使用
) 如果
操作数为 boolean 的时候
,
也表示逻辑运算。
但是
它们
不支持
短路求值。
•运算符之间是有优先级的,在可能存在歧义的代码中
加上括号
即可。
※注释
注释是为了让代码更容易被读懂而附加的描述信息,
不参与编译运行
,
但是却非常重要。
•Java中的注释主要分为以下三种:
1.单行注释:
//
注释内容(用的最多);
2.多行注释:
/*
注释内容
*/
(不推荐);
3.文档注释:
/**
文档注释
*/
(常见于方法和类之上描述方法和类的作用
)
,可用来自动生成文
档。
※关键字
关键字是
Java
中的一些
具有特定含义
的单词。特别注意,在定义的变量名时
不能
和关键字冲突。