文章目录
0. 基本事项
- 一个java源文件里必须定义一个与文件名相同的类,且该类用public修饰。此外,在该文件中还可定义若干个类,但是不能用public修饰。每个类都会生成一个class文件/字节码文件
- 可以将main方法写到非public类中
- 可以两个变量定义在一行。
int a = 1, b = 2;
int a, b = 1;
- 输入与输出:
- 转义字符:
\t
:大空格,制表符\n
:换行\\
:打印出 \\"
:打印出 "\'
:打印出 ’\r
:光标回到首行,再进行覆盖。比如:System.out.println(“美好的\r一天”) --> 一天的
idea中是\r
后面的内容替换前面的内容。比如:System.out.println(“美好的\r一天”) --> 一天- 注释:
- 单行注释:
//
- 多行注释:
/* */
文档注释
:可以被JDK提供的工具javadoc所解析,生成说明文档。
- 关于一些java内置工具
- javac.exe是编译.java文件
- java.exe是执行编译好的.class文件
- javadoc.exe是生成Java说明文档
- jdb.exe是Java调试器
- javaprof.exe是剖析工具
1. 变量
1.1 数据类型
关于初始值:
- 若在类的 全局位置,则 基本数据类型 和 引用数组类型都有默认值。
- 若在类的 局部位置(比如方法内,构造器内,代码块内) ,
① 则 基本数据类型 和 引用数据类型中的类和接口都无默认值。不可使用这些变量,如果打印变量会报未初始化异常。
② 但是 引用数组类型中的元素 有默认值。
- 默认值:
- 基本数据类型都是0,boolean类型对应的就是false。
- 引用数据类型:nul
一旦在推中为其分配空间,此时打印变量,则调用的是toString()方法(若该类没有重写toString方法,则调用Object的)。
引用类型变量默认占
8 B
。因为64b能完全覆盖内存。
细节:
- 对于1,2,3…这种整数默认是int型
3个例外:
- -128 ~ 127可直接赋值给byte,如:byte a = 1;否则会报编译异常】**;
- -2^15 ~ 2^15-1,即 -32768 ~ 32767可直接赋值给short,否则会报编译异常】
- char可以赋值任意整型。
- long类型变量赋值时,在数值后加L/l。
eg:long a = 10L
;- float类型变量赋值时,在数值后加F/f。
eg:float a= 10F
;- double类型变量赋值时,可以在数值后面加D/d,也可以不加,即默认小数是double。
但是对于其包装类的实例化时可以不加L或F或D。eg:
Long a = new Long(10);
- 浮点数
- 可以使用科学技术法(只用于浮点)。eg:
double a = 5.2e-2; // 5.2*10^(-2) = 0.052
对小数运算后进行相等判断时要小心。- 不要使用浮点数进行比较。
- 布尔型:布尔型变量命名时常加上
is
。如:boolen isEat = false;
- 字符
- 字符的本质是数
- 字符可以加减
- 基本数据类型是 值传递,即复制内容;引用数据类型是 传递地址。
因为,赋值就是将内容复制过去,而引用数据类型的内容是地址,所以表现为传递地址。
1.2 变量名命名
标识符命名:
- 字母、数字、_、$。但是不能以数字开头
- 不含空格、不能用关键字和保留字
1.3 不同进制赋值
进制表示:
- 二进制:0b或0B。eg:int a = 0b11; // a = 3
- 八进制:0。eg:int a = 013; // a = 11
- 十六进制:0x或0X。eg:int a = 0x13; // a = 19
1.4 类型转换
1.4.1 基本数据类型间的自动类型转换
- 自动转换① :
- 自动转换② : byte、short、char相同类型或三者之间的运算,会将精度提高的int。
- 练习:
1.4.2 基本数据类型间的强制类型转换
强制类型转换中注意计算机采用补码存放数据。
( )
只对最近的数有效
- 强制转换规则:
- 整数间:
- 大变小:补码:高位截断,低位保留。
- 小变大:补码:扩展符号位。
- 浮点数到整数:丢失小数位。
- 细节:布尔类型不可以其他类型相互转换,如:
1.4.3 引用类型与其他类型的转换
- 引用类型与引用类型间
- 一般不可以进行自动类型转换,除非是多态中的向上转型。
- 一般不可以进行强制转换,除非是多态中的向下转型。
- 包装类与对应的基本数据类型间:可以自动 的 相互转换。
- String与基本数据类型间
- 不可以进行自动转换,但是String类型与基本数据类型进行
+
操作会自动转为字符串。注意:String类型与基本数据类型进行
+
操作过程:
- 先将基本类型自动转为字符串
- 再进行字符串拼接
- 不可以进行强制类型转换。
注意:虽然String与基本数据类型间不可以强制类型转换,但是可以使用方法进行类型转换
- . String->int:
Integer.parseInt("1")
- int->String:
1 + ""
- 除包装类和String外的引用数据类型 与 基本数据类型:不可以进行自动类型转换,也不可以进行强制类型转换。
1.4.4 练习
2. 运算符
细节:
a /= b
等价于a = (强转为a类型) a / b
【++、+=等类似】
- 三元表达式:
变量 = 条件表达式 ? 表达式1 : 表达式2
。条件表达式为true执行表达式1,反之执行表达式2。注意:三元运算符要看作一个整体,故其可能导致类型的自动转换。
- i++ 与 ++i
- ① i++:先用后加:所在行语句执行完后,再执行++
② ++i:先加后用:先执行++,再执行所在行语句
i = ++i
、i = i++
的结果与上面一致。
技巧:将左边的i想象为不是i,则很容易得到结果
原理:其内部是用了一个temp变量暂存数据,最后赋值给变量。
&&
与&
- 相同点:
&&
是短路与,&
是逻辑与。运算结果一样。- 区别:第一个为false,则&&不进行后续判断,效率高;而&还需要进行后续判断。故多使用&&。【 || 是第一个为true就不进行后续判断】
- 例子:在后面逻辑中有赋值语句时,用逻辑与。
- 取相反数的两种方式:
- 在一行语句中可以随时赋值:因为赋值最后生效,若需要先生效,可以使用()
练习
3. 控制结构
3.1 分支结构
if
、if-else
、if - else if - else
:用于区间的情况
{ }
内只有一条语句时,可以不用{ }
- 从上往下,满足一个分支,则不会再看下面的分支
switch-case-break-default
:用于值确定的情况
- switch的表达式只能是以下6种类型:
byte、short、char、int、enum、String
(因为小数不能用来比较相等)- default 可以有,也可以没有
- 从上往下,满足一个分支,若没有使用break,会接着执行下一个case。常用于几个case内容相同的情况。
3.2 循环结构
- for循环
for(初始值; 表达式1; 表达式2) { }
中可缺少成分,如:for( ; ; )
- 增强for循环(for-each循环):可用于数组或集合,底层使用的是迭代器实现遍历。
语法:for(数据类型 变量名 : 数组或集合对象) { }
for循环底层采用的是计组的随机访问;而for-each循环底层采用的是顺序访问。
- while:先判断,后执行
- do-while:先执行,后判断
注意:
break
打破对象是switch
和三个循环结构
,没有if
continue
结束本次循环,继续执行下一次循环