1变量
1.1变量的定义
变量是一个用于存放用户数据或程序运行产生数据的量。通常来说,如果定义了一个变量,那么计算机会在内存中为该变量开辟一块空间,这块空间用于存放该变量对应的数据。
1.2变量的命名规则
Java中,变量命名有如下规则:
- 必须以字母、下划线、或者美元符
$
开头;以美元符$
开头命名的变量虽然能够编译通过但是不建议使用;中文也可以作为命名开头且编译也能通过,但是不建议使用。 - 除开头外后面的部分可以有字母、下划线、美元符` 的变量虽然能够编译通过但是不建议使用。
- 变量名不限制长度,但要能表达清楚命名的含义。
- 变量名不可以和java的关键字冲突。(附:Java关键字)
- 变量名大小写敏感,即
A
和a
是两个完全不同的变量。
1.3变量的定义和使用
Java的变量定义、赋值和使用规则与C语言一样。
1.3.1变量的作用域
同C语言一样,Java变量的作用域仅限在一个代码块内(即一个花括号内)。
2数据类型
Java的数据类型包括基本类型和引用类型,对于基本类型,其又分为四类(整型,浮点型,字符型,布尔型)八种(整型有四种,浮点型有两种,字符型一种,布尔型一种)。
2.1基本类型
2.1.1基本类型
数据类型 | 所占内存(单位:字节) | 范围 | |
整型 | byte | 1 | -128~127 |
short | 2 | -32768~32767 | |
int | 4 | -2147483648~2147483647 | |
long | 8 | (-2^63)~(2^63-1) | |
浮点型 | float | 4 | -- |
double | 8 | -- | |
字符型 | char | 2 | -- |
布尔型 | boolean | -- | true 或 false |
注:
- 不同于C语言的是,Java中变量所占的内存是固定的,不会因操作平台和编译器的改变而改变;但是对于boolen类型,不同的JVM实现略有不同,有些JVM实现的是占1个字节,有些是占一个比特位,这个没有明确的规定。
- Java中的浮点型同样的遵循国际标准IEEE 754,在《C语言数据类型》一文中已经详细说明,此处不再赘述。
- 不同于C语言的是,Java中char类型不仅可以表示字符(ASCII码表中的字符),也可以表示汉字,同样的Java中字符也用
‘’
。 - boolean类型只有两个值,true或者false,这与一般的情况也是一样的,因为在编程范围内,要么对,要么错,不会存在两种叠加的状态。
- 不同于C语言的是,Java中并没有”无符号数“这一概念。
2.1.2包装类
对于基本类型的取值范围,无需刻意记忆,它们的值都已经以常量的形式定义在对应的包装类中了。使用时只需调用相关的命令即可,例如:
byte
的包装类为java.lang.Byte
,其用法为
System.out.println(Byte.MIN_VALUE);
即可在屏幕输出byte
类型对应的最小值。
基本类型 | 包装类 | 最小值 | 最大值 |
byte | java.lang.Byte | Byte.MIN_VALUE | Byte.MAX_VALUE |
short | java.lang.Short | Short.MIN_VALUE | Short.MAX_VALUE |
int | java.lang.Integer | Integer.MIN_VALUE | Integer.MAX_VALUE |
long | java.lang.Long | Long.MIN_VALUE | Long.MAX_VALUE |
float | java.lang.Float | Float.MIN_VALUE | Float.MAX_VALUE |
double | java.lang.Double | Double.MIN_VALUE | Double.MAX_VALUE |
char | java.lang.Character | Character.MIN_VALU | Character.MAX_VALUE |
2.2字符串类型
在Java中,字符串类型属于引用类型,因为字符串也是较为常用的类型,所以在这里也做一个简单的介绍。
2.2.1字符串定义
字符串定义的基本格式为:
String 变量名 = ”字符串内容“;
例如:
String name = "张三";
同样的,C语言中的转义字符依旧适用于Java。
2.2.2字符串的+运算
字符串+
操作,表示对字符串的拼接,例如:
String a = "abc";
String b = "de";
String c = a + b;
System.out.print(c);
//程序的运行结果为
abcde
int a = 1;
int b = 2;
System.out.print("a + b =" + a + b);
//程序的运行结果为
a + b =12
可以看出,当一个含有+
的表达式中有字符串的时候,会把其他变量的值也认为是字符串然后进行拼接。有些情况下,为了避免上述情况发生(我们期望输出的实际应该是3),应该加入括号来改变优先级:
int a = 1;
int b = 2;
System.out.print("a + b =" + (a + b));
//程序的运行结果为
a + b =3
2.3常量
在Java中,用final来修饰常量(与C语言中const类似),即
final int a = 10;
2.4类型转换
Java属于强类型语言,当不同类型的变量相互赋值(实际中,这种情况是无法避免的)时,会有严格的校验。
一般有如下规则:
- 不同数字类型的变量之间赋值,表示范围更小的类型能够隐式转换为表示范围大的类型,反之则不行(例如:可以把byte(1字节)类型的数据赋给int(4字节),但不能把int赋值给byte)。同样的,由于byte所表示的范围是-128~127,我们也不能把小于-128或大于127的数值赋值给byte类型的数据。
- 若要把表示范围更大的数字类型变量赋值给范围小的,则需要强制类型转换。但强制类型转换可能会使精度丢失。即:
int a = 10;
double b = 8.5;
a = (int)b;
- 互不相干的两种类型则不能相互赋值,也无法使用强制类型转换赋值。即整型与布尔型、浮点型与布尔型、字符型与布尔型不能相互赋值。但是整型与字符型可以通过强制类型转换赋值。
前两条可以理解为两个大小不一样的容器,大容器可以容纳下小容器的全部内容,而小容器不一定能装下大容器的内容(装不下的部分就被丢掉,即所谓的精度丢失)。
2.5数值提升
在对数据进行混合运算时,如果数据的类型表示的范围不一样(即所占字节数的大小不一样),则需要进行数值提升。
- 例如int 和long类型的数据进行计算,计算器会先将int类型的数据提升为long,然后再进行计算。例如:
int a = 10;
long b = 20L;
a+b;
对于a+b的结果,由于发生了数值提升,所以其结果也为long类型,需要用一个long类型的变量来接收,如果使用int类型的来接收,则需要进行强制类型转换,即
int c = (int)(a + b);
//或
long d =a + b;
- 计算机CPU通常按照4个字节为一组从计算机内存读取数据,所以为了硬件上实现方便,对于小于4个字节的数据类型(即short,byte类型),会先提升为int类型,然后再进行计算。
2.6int 和String之间的相互转换
2.6.1int转String
int num = 10;
//方法1
String str1 = num + "";
//方法2
String str2 = String.valueof(num);
2.6.2String转int
如果一个字符串中的格式为整数,则可以转换为int,如果字符串中还含有其他的字符,则转换失败。转换方式如下:
String str1 = "1010";
int num =Integer.parseInt(str1);
其他数值类型转换同理。
3运算符
3.1赋值运算符=
在任何一门语言中,最基本的就是赋值运算符=
,赋值运算符即为=
,其含义为把等号右边表示的值赋给左边的变量。
3.2算术运算符
算数运算符包括基本四则运算符和增量运算符。
3.2.1基本四则运算符
基本四则运算符即为:加减乘除以及求余(又称”求模“,其符号为%
)。其中求余运算不仅能对整数求余,也能对浮点数进行求余。
例如:
11.5 % 2.0;
//其结果为
1.5
3.2.2增量赋值运算符
增量赋值运算符包括:+=、-=、/=、*=、%=
。例如:
a += 2;
//等价于
a = a + 2;//其他运算符同理。
3.2.3自增/自减运算符++、--
其用法与C语言中一致。
3.3关系运算符
和数学中的关系含义一致,包括:等于(==
)、不等于(!=
)、大于(>
)、小于(<
)、大于等于(>=
)、小于等于(<=
)。关系运算符的返回值为boolean
类型。
3.4逻辑运算符
逻辑运算符为:逻辑与(&&
)、逻辑或(||
)、逻辑非(!
)。
逻辑运算符的操作数和返回值都是boolean类型的。
3.4.1逻辑与&&
运算规则为:同真则真,一假全假。
3.4.2逻辑或||
运算规则为:一真则真,全假才假。
3.4.3逻辑非!
规则:如果操作数是true,则结果为false,同理,若操作数是false,则结果为true。
由于逻辑运算符在中学数学、大学相关课程都有相关介绍,此处不再赘述。
3.4.4短路求值
对于逻辑与和逻辑或遵循短路求值的规则。
所谓的短路求值,就是对于逻辑与,一假全假,如果程序执行过程中发现某个逻辑与符号的左侧条件是假的,则这个符号后边的其他操作数不会再执行。例如:
System.out.print(1>2 && 1/0);
因为1是小于2的,所以1>2
结果为false,&&
右侧的1/0则不会执行。
同理,对于逻辑或,一真则真,所以程序执行过程中发现某个逻辑或符号的左侧条件是真,则这个符号后边的其他操作数则不会再执行。
System.out.print(1< 2 || 1/0);
因为1是小于2的,所以1>2
结果为true,||
右侧的1/0则不会执行。
3.4.5&和|
&
和|
两侧的操作数为boolean类型时,也表示逻辑运算,但这两个符号不支持短路求值。
3.5位运算符
同C语言一样,Java中对数据操作的最小单位是二进制位,位运算符主要有:&、|、~、^
。位运算就是按照二进制位来运算。
3.5.1按位与&
同逻辑与一样,只有二进制位全为1结果才为1,否则为0.例如:
1100 & 0101
//结果为
0100
3.5.2按位或|
同逻辑或一样,只要有一个为1,则结果为1,全为0结果才为0.例如:
1100 | 0110
//结果为
1110
3.5.3按位取反~
把对应位置的0变为1,把1变为0.例如:
~(11010)
//结果为
00101
3.5.4按位异或^
如果两个数字二进制位数字相同,则结果为0,否则为1。例如:
(101101) ^ (100010)
//结果为
001111
3.6移位运算
移位运算符有三个:<<、>>、>>>
,同位运算符一样,移位运算也是针对二进制位来讲的。
3.6.1左移<<
即最左侧的二进制位丢掉,在右侧补0.
3.6.2右移>>
最右侧的二进制位丢掉,在左侧补符号位(正数为0,负数为1)。
3.6.3无符号右移>>>
最右侧的位丢掉,在左侧统一补0.
3.7条件运算符
条件运算符格式如下:
表达式1 ? 表达式2 : 表达式3
当表达式1
为true时,整个表达式的结果为表达式2
,否则为表达式3
.
3.8运算符优先级
一般而言,单目运算符优先级较高,赋值运算符优先级较低。算术运算符优先级较高,关系和逻辑运算符优先级较低。多数运算符具有左结合性,单目运算符、三目运算符、赋值运算符具有右结合性。
4注释
Java中注释分为3种
- 单行注释:
//注释内容
- 多行注释:
/*注释内容*/
- 文档注释:
/**文档注释*/