数据类型与变量
变量和标识符
变量声明和赋值与C++一致,注意float
标识符:字母、数字、下划线、美元符号组成,不可以用数字开头
Java书写习惯:类名首字母大写;包名、方法名、变量名都要小写(camel);少用下划线;常量随用随定义
数据类型
数据类型决定数据的存储方式和运算方式
Java中的数据类型分为两大类:基本数据类型和引用类型
基本数据类型 primitive types
数值型(整数、浮点数)、字符型、布尔型 byte short int long(8字节) float double boolean char(null)
基本数据类型变量存储在栈中
赋值时,复制的是值
整型
byte 1字节 -128-127
short 2字节 \(-2^{15}\) ~ \(2^{15}-1\)
int 4字节 \(-2^{31}\) ~ \(2^{31}-1\)
long 8字节 \(-2^{63}\) ~ \(2^{63}-1\)
整数:8进制0开头,16进制0x开头 二进制0b开头
java中没有无符号数,如果想要正整数,可以用long模拟
浮点数
float单精度 4字节 -3.403E38 ~ 3.403E38
double双精度 8字节 -1.798E308 ~ 1.798E308
千分位可以用下划线表示,如123_456.789_000
科学记数法:1.14E2
浮点类型默认为double类型,如果想要声明float类型变量,需要在后面添加一个f,如float d = 3.14f
布尔类型 boolean
boolean只允许true或false
不可以用0或者非零的值代替
字符 char
Java字符采用Unicode编码,每个字符占两个字节
可用16进制编码表示,如char c1='\u0061'
引用类型 reference type
类(class)、接口(interface)、数组
变量引用在堆中,栈中其实是一个指针
赋值时,复制的是引用,没有复制对象本身
运算符与表达式
运算符
算术运算符 + - * / % ++ --,和 C++都一样
关系运算符 < > <= >= == !=,和 C++都一样
逻辑运算符 ! & | ^ && ||,和 C++都一样
p.s. 短路与、短路或两个运算符,如果第一个表达式可以得到判断结果,不会进行后方的表达式的计算
位运算符 & | ^ ~ >> << >>>,和 C++都一样
(1) 左移 <
(2) 右移 >>:将二进制形式的a逐位右移b位,最高位空出的位补原来的符号位
(3) 无符号右移 >>>:右移最高位补0
移位运算符对于低于int型的操作数会先自动转为int(整型提升)
p.s. 虽然java没有无符号这一说,但是无符号右移运算很重要,使用Integer.toBinaryString()转化成二进制字符串检查
赋值运算符 =
当=两侧数据类型不一致时,可以使用默认类型转换或者强制类型转换
扩展赋值运算符 += -= *= /=等
字符串连接运算符 +
当+两侧只要有一个是字符串类型,其他数据都会被自动转换为字符串类型
表达式
运算优先级与结合性(尽量用括号)
结合性
操作符
R-L
++, --, ~, !, (类型转换)
L-R
*, /, %
L-R
+, -
L-R
<>, >>>
L-R
, <=, >=, instanceof
L-R
==, !=
L-R
&
L-R
^
L-R
|
L-R
&&
L-R
||
R-L
?:
R-L
=, *=, /=, ...
类型转换
整型提升:byte short char参与运算转为int
注释
//:单行注释
/.../:多行注释,不能嵌套
/**...*/ doc注释,可以用来生成文档
@see:引用其他类
@version:版本信息
@author:作者信息
@param:参数说明
@return:说明
@exception:异常说明
流程控制语句
顺序
简单语句:方法调用语句、赋值语句等,记得加分号
没有表达式语句 如 x+y;
分支
和C++一样
if语句
if(){
语句;
}
else{
语句;
}
// 最多两个分支,可以else if
switch语句
变量类型是数数、字符、字符串
case后面的value得是常量
switch(var){
case value1:
语句1;
break;
case value12:
语句2;
break;
...
default:
语句;
break;
}
循环
和C++一样
for,while,do while
for(初始条件; 终止条件; 循环操作){ 语句}
while(循环条件){ 语句 }
do{ 语句 }while(循环条件);
在循环中,可以使用标签来控制bbreak和continue跳出的位置
lable1: {
lable2: {
lable3: {
break label2;
}
}
}
数组
一维数组
int[] a = new int[]{3,4,5};
// 不要写int[] a = new int[3]{3,4,5}
Person[] p = new Person[]{new Person(1), new Person(2), new Person(3)};
int[] a = new int[3];
a[0] = 3;
a[1] = 4;
a[2] = 5;
数组需要使用new分配空间后使用,在java中,C++的int a[5];写法是不对的,因为java中的数组只是一个引用,引用堆中的五个元素空间
数组一经分配空间,每个元素也被按照成员变量同样的方式被隐式初始化,数值类型初始化为0,引用类型为null
数组分配空间后,大小固定,有一个length属性来指明长度,如a.length,C++中没有大小
数组遍历:for(int age : ages),ages数组中的每一个元素age,这是只读式的遍历,不能赋值
数组的复制:System.arraycopy(source, start_index, dest, target_index, source.Length)
二维数组
int [][] a = {{1,2}, {3,4,0,9}, {5,6,7}};
int [][] m = new int[3][5];
int [][] t = new int[3][];
t[0] = new int[2];
t[1] = new int[4];
t[2] = new int[3];