变量

赋值

int a, b, c = 10;

此时 a 和 b 是没有赋值的。
否则需要单独赋值:

int a = 10, b = 10, c = 10;

分类

全局变量:类体外的变量,通常全大写。
成员变量:类的属性,类体内,类的方法外。
局部变量:方法中声明的变量。

作用域即声明位置所在代码块({})内,且如果作用域重叠,则采用就近原则。

数据类型

基本数据类型

第一类 整数型
byte short int

第二类 浮点型
float double

第三类 布尔型
boolean

第四类 字符型
char

引用数据类型

例如:
字符串型String
java.math.BigDecimal

类型转换

int a = 10; //10
int b = 010; //8
int c = 0x10; //16
int d = 0b10; //2

int e = 100L; //将会转换为 long 型变量
long f = 100; //与上一条语句相同,自动类型转换
long g = 300L; //此处不存在类型转换

long h = 2147483648; //会报错,因为 2147483648 默认为 int 型,在赋值之前,输入内存时就会报错

1、字面量进入内存后默认是 int 或 daouble。小容量可以直接赋值大容量,即自动类型转换;大容量一般不能直接赋值小容量,需要强制类型转换,但会损失精度。

long x = 100L;
int y = (int)x;

float m = 3.14F;
double n = m;

2、但是,对于 byte、short、char 型来说,当值没有超过容量时,还是可以自动类型转换。但前提是右值是字面量,如果是变量名则仍然会报错,因为具体的赋值和运算是运行时的内容,编译过程中编译器并不知道变量里的值。

3、另外,和 C/C++ 一样,char 赋整数时会按 ASCII 码自动转换为字符。

4、byte、char、short 做混合运算时,会各自转成 int 型再做运算。而如果有 long 或者 float(更高精度的数据类型)参与运算时,则会自动向上转换。

5、 boolean 类型不能转换。

转义

char x = \u4e2d; //将十六进制数按 Unicode 解码为字符“中”

运算

&、| 和 &&、|| 的区别:

前者为逻辑运算符,后者为短路运算符,结果是一致的,但后者在左表达式结果就足以判断整个式子的结果时,右表达式会被跳过。相比而言,后者运行效率更高。

a = a + 1 和 a += 1 的区别

使用扩展赋值运算符时,变量不会改变运算类型,或者说在运算结束后会默认强制类型转换 。所以可能意外的精度损失。

+号是求和还是拼接?

System.out.println(110 + 120) //230
System.out.println(110 + "120") //110120
System.out println(1 + 2 +"3") //33
System.out.println(1 + (2 + "3")) //123

特例

int a = 10;
a = a++;

在 java 中,该段语句的结果是 10;但在 C++ 中结果是 11。

控制语句

switch

1、注意 switch 和 C/C++ 同样存在 case 穿透,所以需要注意使用 break 结尾
2、另外,分支条件只能是 String 和 int ,char、byte、short 会自动类型转换为 int,long 则会编译报错。
3、case 合并:

switch (x) {
case 1: case 2: case3: 
	...
	break;
}

case 合并本质上和 case 穿透是一样的。

do…while

记得 while() 之后要加分号,因为编译器需要一个代码块结束的标志。

break

break 指定循环。

a: for (int i = 0; i < 10; i++){
	b: for (int j = 0; j < 5; j ++){
		if (j >=3) {
			break a;
		}
	}
}

同理 continue 也有类似的使用方法

Tips

输入语句:

java.util.Scanner s = java.util.Scanner(System.in);
int i = s.nextInt();

或者

import java.util.Scanner
Scanner s = Scanner(System.in);
String str = s.next();