1.注释
//
/* */ 不能嵌套,因为要注释的代码块中可能包含*/界定符
/** */ 可以用来自动地生成文档(?不懂)
2.数据类型
Java是一种强类型语言。
8种基本数据类型:4种整型,2种浮点类型,1种字符类型char,1种表示真值的类型boolean。
2.1整型
用于表示整数(没有小数部分的数值),包括正整数和负整数——有符号数,如9,-19。
byte 1字节(8bit) -128~127 2^8=256。原码反码补码参照博客https://www.cnblogs.com/wkfvawl/p/10512739.html
short 2字节 -32768~32767 2^16=65536。65536/2=32768。
int 4字节 -21,4748,3648~21,4748,3647(刚刚超过20亿 2^32=42,9496,7296 最常用,但如果要表示整个地球的人口这种,就需要用long了。
long 8字节 2^64=1844,6744,0737,0955,1616
与C/C++不同,Java中,整型的范围与目标平台无关。无论是16位、32位还是64位处理器,4种整型的表示范围都是上面这样。
十六进制前缀0x或0X(如0xCAFE),八进制前缀0(如010,八进制易混淆),二进制前缀0b或0B。
长整型数值后面有一个后缀L或l,如4000000000L。
Java7之后,可以为数字加下划线使其更易读,Java编译器会自动去除这些下划线,不会影响程序运行。如1_000_000,0b1111_0100_0010_0100_0000。
注意:Java没有任何无符号形式(unsigned)的byte,short,int,long。
2.2浮点类型
浮点类型用于表示有小数部分的数值。
float 4字节 有效位数6~7位
double 8字节 有效位数15位
float类型的数值后缀为F或f,double类型的数值后缀为D或d,没有后缀的浮点数默认为double类型,如3.14。
三个特殊的浮点数值:正无穷大,负无穷大和NaN。分别用常量Double.POSITIVE_INFINITY,Double.NEGATIVE_INFINITY和Double.NaN表示。
一个正整数除以0的结果为正无穷大,负整数除以0的结果为负无穷大,0/0或负数的平方根的结果为NaN。判断一个数是不是NaN,不能用x==Double.NaN,而应该使用Double.isNaN(x)。因为非数值的值都认为是不相同的,
即使x是NaN,用第一种判断方法也会得出不相等的结果。
2.3字符类型
char 要用单引号括起来,如'A'
强烈建议不要在程序中使用char类型,除非确实需要处理UTF-16代码单元。
2.4boolean类型
布尔类型有两个值:true和false,不像C/C++那样,0相当于false,非0相当于true,Java中整型值和布尔值之间不能相互转换。
3.变量与常量
3.1声明变量
double salary;
int vacationDays;
long earthPopulation;
boolean done;
常用的变量命名:
Box box;
Box aBox;//"Box" is a type
3.2变量初始化
声明之后,使用赋值语句进行显式初始化。未初始化的变量的值不能使用。
int vacationDays;
vacationDays = 12;
也可以将声明和初始化放在同一行:
int vacationDays = 12;
变量的声明尽可能靠近变量第一次使用的地方,这是一种良好的编程习惯。
从Java10开始,如果可以从变量的初始值推断出变量的类型,就不再需要为变量声明类型。只需使用关键字var:
var vacationDays = 12;//vacationDays is an int
var greeting = "hello";//greeting is a string
Java不区分声明和定义,C/C++区分声明和定义。
3.3常量
在Java中,使用关键字final指示常量。常量意味着只能被赋值一次,一旦赋值,不可更改。常量名一般使用全大写。
final double CM_PER_INCH = 2.54;
如果希望某个常量可以在一个类的多个方法中使用,可以使用关键字static final设置一个类常量(class constant)。类常量的定义位于main方法的外部,也正因如此,同一个类的其他方法也可以使用这个常量。
如果希望在其他类的方法中使用这个常量,可以将其声明为public。
public class Constants
{
public static final double CM_PER_INCH = 2.54;
public static void main(String[] args)
{
}
}
const是Java的关键字,但是目前并没有使用,在Java中,必须使用final定义常量。
3.4枚举类型
有时候,变量的取值只在一个有限的集合内。如衣服尺码一般只有小、中、大和超大四种,可以将这些尺码编码为1、2、3、4。但是在使用时,变量中保存的可能是一个错误无意义的值,如0。
为了避免这种情况发生, 我们可以自定义枚举类型,将变量的取值限制在一个有限的集合内。如
enume Size { SMALL, MEDIUM, LARGE, EXTRE_LARGE };
之后,就可以声明Size类型的变量:
Size s = Size.MEDIUM;
Size类型的变量只能存储类型声明中给定的某个枚举值,或者是null,null表示这个变量没有设置任何值。
4.运算符
4.1算术运算符
+、-、*、/分别表示加减乘数。
%表示整数的求余操作(又叫取模)。
当参与/运算的两个操作数都是整数时,表示整数除法;否则,表示浮点除法。例如:
15/2等于7, 15%2等于1, 15.0/2等于7.5。
整数除以0,会产生一个异常;浮点数除以0,会得到无穷大或NaN。
4.2数学函数与常量
Math类中,包含了各种各样的数学函数。
平方根函数,sqrt:
double y = Math.sqrt(x);
幂函数,pow:
double y = Math.pow(x,a); //y = x^a
关于整数求余数的方法,floormod; (?不懂)
三角函数:
Math.sin
Math.cos
Math.tan
Math.atan
Math.atan2
指数函数和对数函数:
Math.exp //exponent
Math.log
Math.log10
π和e常量的近似值:
Math.PI
Math.E
在实际使用时,不必在这些方法和常量面前添加“Math”前缀,只需在源文件顶部进行静态导入:
import static java.lang.Math.*;
Math类与StrictMath类的区别(?不懂)
4.3数值类型之间的转换 (自动、合法的转换)
4.4强制类型转换
强制类型转换的语法如下:
double x = 9.997;
int nx = (int) x; //强制类型转换通过截断小数部分将浮点数转换为整型,因此nx等于9
如果希望进行舍入运算,以求得最接近的整数,需要使用Math.round方法:
double x = 9.997;
int nx = (int) Math.round(x);//nx等于10
当调用round时,仍需要使用强制类型转换(int)。这是因为round的返回值是long类型的,由于从long到int存在信息丢失的可能,因此只有使用显式的强制类型转换才能将long类型转换为int类型。
4.5结合赋值和运算符
可以在赋值中使用二元运算符,例如:
x += 4;
等价于
x = x + 4;
4.6自增自减运算符
n++; ++n; n--; --n;
前缀和后缀形式的自增自减运算符,在表达式中使用时,会有一些区别,例如:
int m = 7;
int n = 7;
int a = 2 * ++m; // now a is 16, m is 8
int b = 2 * n++; // now b is 14, n is 8
建议不要在表达式中使用++,因为这样很容易让人困惑,而且容易产生bug。
4.8关系和boolean运算符
关系运算符:
== != < > <= >=
boolean运算符:
逻辑与&& 逻辑或|| 逻辑非!
逻辑与、逻辑或、逻辑非是对boolean值的操作,属于离散数学范畴。按位与、按位或、按位非是对计算机位的操作,属于计算机二进制位运算范畴。
&&和||都是按照短路方式来求值的,当第一个操作数已经能确定表达式的值时,第二个操作数就不会再计算了。这一点可以巧妙地使用:
x != 0 && 1/x > x+y; //no division by 0
如果x等于0,那么第二部分就不会计算,也就是不会计算1/x,这样就避免了除以0的错误。
Java支持三元操作符?:
condition ? expression1 : expression2
如果条件为true,上面这个表达式的值就是表达式1的值,如果条件为false,上面这个表达式的值就是表达式2的值。例如:
x<y ? x : y;//会返回x和y中较小的那一个
4.9位运算符 (?不懂)
&("and") |("or") ^("xor") ~("not")
移位运算符>>和<<
>>>运算符 (不存在<<<运算符)
4.10括号与运算符级别
如果不使用圆括号,就按照运算符优先级次序进行计算。同一个级别的运算符按照从左向右的次序进行计算(右结合运算符除外)。
例如,由于&&的优先级比||高,所以表达式
a && b || c
等价于
(a && b) || c
由于+=是右结合运算符,所以表达式
a += b += c
等价于
a += (b += c)
Java运算符优先级表见《Java核心技术卷一》p44.
与C/C++不同,Java不使用逗号运算符,不过可以在for语句中使用逗号分隔表达式列表。
5.字符串
从概念上讲,Java字符串就是Unicode字符序列。Java中没有内置的字符串类型,而是在标准Java类库中提供了一个预定义类,叫做String,Java中每个用双括号括起来的字符串都是String类的一个实例:
String e = ""; //an empty string
String greeting = "Hello";
5.1子串
String类的substring方法可以从一个较大的字符串中提取出一个子串。例如:
String greeting = "Hello";
String s = greeting.substring(0,3); //s等于“Hel”
substring方法的第二个参数表示的是不想复制的第一个位置,例如上面的代码表示复制位置0,1,2的字符。
5.2拼接
与绝大多数程序设计语言一样,Java允许使用+号拼接两个字符串。
String expletive = "Expletive";
String PG13 = "deleted";
String message = expletive + PG13; //message等于"Expletivedeleted"
当将一个字符串与一个非字符串的值进行拼接时,后者会转换成字符串,例如:
int age = 13;
String rating = "PG" + age; //rating等于"PG13"
这一特性经常用在输出语句中,例如:
System.out.println("The answer is " + answer);
如果需要把多个字符串放在一起,用一个界定符分隔,可以使用静态join方法:
String all = String.join(" / ", "S", "M", "L", "XL"); //all等于“S / M / L / XL”
在Java11中,还提供了一个repeat方法:
String repeated = "Java".repeat(3); //repeated等于"JavaJavaJava"