时间:2018-07-16
作者:魏文应
一、关键字
Java 目前使用到的关键字:
保留字,就是现有Java版本尚未使用,但以后版本可能会作为关键字使用:
byValue、cast、future、 generic、 inner、 operator、 outer、 rest、 var 、 goto 、const
二、标识符
类、变量、方法等所命名的名称,这个名称就叫 标识符。也就是说,凡是自己可以起名字的地方都叫标识符。定义规则:
- 由26个英文字母大小写,0-9 ,_或 $ 组成
- 数字不可以开头。
- 不可以使用关键字和保留字,但能包含关键字和保留字。
- Java中严格区分大小写,长度无限制。
- 标识符不能包含空格。
注意:在起名字时,为了提高阅读性,要尽量有意义,“见名知意”。
三、变量
先定义,后使用:
class Veriable{
public static void main(String[] args){
int myInt = 10;
double myDouble = 12.3;
System.out.println(myInt);
System.out.println(myInt + myDouble);
}
}
变量数据类型
对于每一种数据都定义了 明确的 具体数据类型,在内存中分配了 不同大小 的内存空间:
变量的表数范围
不同的数据类型,能够表示的数据范围是不一样的。Java 的表数范围和字段长度是 固定不变的,不受 操作系统OS 影响:
数据类型 | 占用存储空间大小 | 表数范围 |
---|---|---|
byte | 1字节(8bit) | -128~127 |
short | 2字节 | (-2^15) ~ (2^15 -1) |
int | 4字节 | (-2^31) ~ (2^31 - 1) |
long | 8字节 | (-2^63) ~ (2^63 - 1) |
float | 4字节 | -3.403E38 ~ 3.403E38 |
double | 8字节 | -1.798E308 ~ 1.798E308 |
字符类型 | 占用存储空间大小 | 字段长度 |
---|---|---|
char | 2字节 | 单字符(一个中文、英文、日文等等) |
如果要表示一个 字符串,需要用字符串类 String
:
String str = "中国"
在声明数据类型时,我们要注意:
-
声明 long 数据类型,要在其后面加上
L
或者l
:// 范围不超时,不加 L 不会报错 long myName = 123423L;
-
声明 float 数据类型,要在其后面加上
F
或者f
:// 不加 F 会报错,必须加 F float myName = 12.43F;
另外,还有一个 布尔数据类型 : boolean
。 它只能取值 true
和 flase
。和C语言不一样,Java中 不能 用 0 表示 flase,用 非0 表示 true 。
变量类型自动转换。
变量自动类型转换,由编译器自动完成。当容量小的类型和容量大的类型运算时,容量小的自动转化为容量大的类型:
char、byte、short ===> int ===> long ===> float ===> double
在 byte、char、short 运算中,其运算结果,不能赋值给 byte、char、short
类型的变量,应该赋值给int类型的变量。
运算类型组合 | 运算类型组合 | 运算类型组合 |
---|---|---|
byte + byte | byte + short | byte + char |
char + char | char + byte | char + short |
short + short | short + byte | short + char |
比如下面代码编译就会报错:
class TestVeriable{
public static void main(String[] args){
char myChar1 = 127;
char myChar2 = 127;
// 正确的应该这样:int myChar3 = myChar1 + myChar2;
char myChar3 = myChar1 + myChar2;
System.out.println(myChar3);
}
}
int 类型中,将 两个 int 类型的数相加,相加得到的和,赋值给一个 int 类型。虽然这中操作是 被编译器允许的,但要注意 数据可能溢出:
class TestVeriable{
public static void main(String[] args){
int myInt1 = 2147483647;
int myInt2 = 2147483647;
int myInt3 = myInt1 + myInt2;
System.out.println(myInt3);
}
}
上面 TestVeriable.java 源文件中,int 最大可以存储的值为 2147483647
, 相加之后,超出了 int 所能存储的最大值,运行没有报错,但 结果是错误的:
和 int 类型一样,在类似于 变量1 = 变量2 + 变量3
这样的表达式中,允许这三个变量 均为同一数据类型 的还有: long、float、double 。
强制类型转换
容量大的数据类型,转换为容量小的数据类型,这时就是 强制类型转换 。比如:
class TestVeriable{
public static void main(String[] args){
int tmp1 = 1111;
byte tmp2 = (byte)tmp1;
System.out.println(tmp2);
}
}
注意:强制类型转换,会导致数据精度的损失。 比如上面的输出结果,就不是 1111 ,而是:
String 字符串运算
只能是连接运算,得到的结果仍为一个字符串:
class TestVeriable{
public static void main(String[] args){
int tmp1 = 123456;
String tmp2 = "Hello World!";
System.out.println(tmp2 + tmp1);
}
}
连接符 +
运算要注意:'a' + 'b'
会得到一个数(+号这时是相加),"a" + "b"
得到 ab
(+号这时是连接符):
class TestVeriable{
public static void main(String[] args){
System.out.println('a' + 'b');
System.out.println("a" + "b");
}
}
四、进 制
和C语言一样,Java编程中,常用的有以下进制:
二进制: 以
0b
或者0B
开头 的数字,比如: 0b11, 0b10 等。十进制: 源代码中,正常的数字表示就是十进制,比如:1, 2, 3 等。
十六进制: 以
0x
或者0X
开头 的数字,比如:0x11, 0xF1 等。八进制: 以
0
开头 的数字,比如 01, 07 等。
五、运算符
运算符 | 代表的意义 |
---|---|
+ - * / |
加、减、乘、除 |
++ -- |
自加1、自减1 |
% |
取模(就是求余数) |
+ |
加号还可以表示 连接符 |
= |
赋值运算符 |
-= += *= /= %= |
扩展赋值运算 |
比较运算符 | 代表的意义 |
---|---|
> < == |
大于、 小于、相等于 |
>= <= != |
大于等于、 小于等于、不等于 |
instanceof | 检查是否是某个类对象,比如: "Hellow" instanceof String |
逻辑运算符 | 代表的意义 |
---|---|
& | ! ^ |
逻辑与、逻辑或、逻辑非、逻辑异或 |
&& || |
短路与、短路或 |
如果判断两边 不是布尔型逻辑判断,而是 数值运算,那么将是 位运算:
位运算符 | 代表的意义 | 示例 |
---|---|---|
<< |
左移(右侧补0) | 31左移3位: 31 << 3 |
>> |
有符号右移(负数时左侧补1) | 31有符号右移3位: 31 >> 3 |
>>> |
无符号右移(左侧补0) | 31无符号右移3位: 31 >>> 3 |
& | |
按位与、按位或 | 5 & 1 、5 | 1 |
^ |
按位异或 | 5 ^ 1 |
~ |
按位取反 | ~5 |
前 ++ 和后 ++
前 ++,先自加1,后运算。比如下面的,tmp 先自加1,再赋值运算给tmp2:
tmp2 = ++tmp;
后 ++ ,先运算,后自加1。比如下面的,tmp 先赋值给tmp2,然后tmp自加1:
tmp2 = tmp++;
逻辑 & 和短路 &&
逻辑& 和短路 && 的逻辑关系是一样的,我们通过下面代码示例,说明 不一样的 地方:
class TestVeriable{
public static void main(String[] args){
int tmp = 10;
boolean b = false;
if(b & (tmp++) > 0){
System.out.println("这是false");
}else{
System.out.println("这是true");
}
System.out.println(tmp);
tmp = 10;
if(b && (tmp++) > 0){
System.out.println("这是false");
}else{
System.out.println("这是true");
}
System.out.println(tmp);
}
}
示例中 b & (tmp++) > 0
,如果 b 是 false,依然还要去运行并判断 (tmp++) > 0
。如果是 b && (tmp++) > 0
, b 是 false 的情况下,后面的 (tmp++) > 0
语句将不再去判断执行。同样的情况,在 逻辑 | 和短路 || 也是一样的。
左移或者右移实现乘法运算
如果 31 << 3
,其结果相当于 31 * 2 * 2* 2
。当然左移太多,会导致溢出,比如 31 << 32
右移32位就变成了0。
有符号右移 >> 和 无符号右移 >>>
如果是正数时,有符号右移 和 无符号右移 是一样的,左侧均补0 。如果是 负数 右移,有符号右移 右侧补1、无符号右移 右侧补0。
class TestVeriable{
public static void main(String[] args){
System.out.println(15 >> 2);
System.out.println(15 >>> 2);
System.out.println(-15 >> 2);
System.out.println(-15 >>> 2);
}
}
也就是说:除了负数的有符号右移,右侧补1,其它左右移都补0。
六、三元运算符
三元运算符:(条件表达式) ? 表达式1 : 表达式2;
。如果条件表达式 成立,执行表达式1,否则,执行表达式2。
class TestVeriable{
public static void main(String[] args){
int m = 12;
int n = 5;
int max = (m > n) ? m : n;
System.out.println(max);
}
}