最近在对照学习黑马程序员的Java视频,对照视频将学习笔记记录下来,以供复习。
1. Idea的安装
1.1 安装软件与版本
本套教程的开发环境是ideaIU-2017.3.4.exe和jdk-9.0.4_windows-x64_bin.exe。附了很详细的破解方法说明。
1.2 两个常用设置:
- 设置Editor的Font为Consolas 32(高清屏),看上去字体比较舒服。
- 设置KeyMap-Main Menu-Code-Completion-Basic Alt+/
1.3 IDEA 常用快捷键总结
- 智能补全:Ctrl+Shift+Space
- 自我修复:Alt+Enter
- 重构一切:Ctrl+Shift+Alt+T
- 切来切去:Ctrl+Tab
- 选你所想【选中上下文相关联代码】:Ctrl+W
- 代码生成:Template/Postfix +Tab
- 发号施令:Ctrl+Shift+A
- 无处藏身:Shift+Shift
- 自动完成:Ctrl+Shift+Enter
- 创造万物:Alt+Insert
2.正斜杠和反斜杠
- 因为dos的命令行参数用了正斜杠,所以路径只能用反斜杠。
- unix的命令行参数用的是中杠,因此路径可以用正斜杠。
- windows为了向下兼容dos,路径用正斜杠、反斜杠都可以。
- 转义符一直都是反斜杠。
3.L与F
- 不加L默认是int,int转为long是安全的,所以会自动转,能编译通过。如果超过int的取值范围还不加L,那么也会直接报错了。
- 浮点数不加F默认是double类型,double转float可能损失精度,因为不会自动转,编译通不过。
float f = (float) 4.5;
//Or, You can use this:
float f = 4.5f;
4.ASCII码
常见的ASCII码
- 字符0-9的ASCII码:48-57;
- 小写字母a-z的ASCII码为:97-122;
- 大写字母A-Z的ASCII码为:65-90;
助记:本人现年48岁,97年香港回归哪年参加工作人家叫我小a,65岁赶上延迟退休人家叫我老A。
- 空字符的ASCII码为0;
- 制表符的ASCII码为9;
- 换行符的ASCII码为10。
助记:空制换----0 9 10(零酒食)
空置换,白捞一场,没有酒可以喝。
ASCII码获取
char c = 'A';
int a = Integer.valueOf(c);
System.out.println(a);
输出:65
5.自增符++的内幕
5.1 助记
- i++ 先人后已
- ++i 先已后人
5.2 助记可能带来的误区
在运算符的优先级中,自增符不管是在变量的前面还是后面,它的优先级是高于赋值符。哪是不是与前面的助记矛盾呢?其实变量是先完成了自增,只是把变量在自增之前的值先用“快照”先保留下来了。
public class JavaPlusPlus {
public static void main(String args[]) {
int x=0;
x = x++;
System.out.println(x);
}
}
// access flags 0x1
public <init>()V
L0
LINENUMBER 3 L0
ALOAD 0
INVOKESPECIAL java/lang/Object.<init> ()V
RETURN
L1
LOCALVARIABLE this Lcn/itcast/day04/demo01/JavaPlusPlus; L0 L1 0
MAXSTACK = 1
MAXLOCALS = 1
// access flags 0x9
public static main([Ljava/lang/String;)V
L0
LINENUMBER 6 L0
ICONST_0 //将数字0压入操作数栈栈顶。
ISTORE 1 //将栈顶数字从栈弹出到局部变量表索引为1位置,即保存到X。
L1
LINENUMBER 7 L1
ILOAD 1//将局部变量表索引为1位置的值压到栈顶,即将X的值压入栈。
IINC 1 1//直接在局部变量表索引为1位置,直接增加1。IINC,I代表整数,INC是增长的英文缩写,1是变量表索引号,1是增加1。
ISTORE 1//操作数栈弹栈,将0从栈弹出到局部变量表索引为1位置,即将数字0存回X。
L2
LINENUMBER 8 L2
GETSTATIC java/lang/System.out : Ljava/io/PrintStream;
ILOAD 1
INVOKEVIRTUAL java/io/PrintStream.println (I)V
L3
LINENUMBER 9 L3
RETURN
L4
LOCALVARIABLE args [Ljava/lang/String; L0 L4 0
LOCALVARIABLE x I L1 L4 1
MAXSTACK = 2
MAXLOCALS = 2
}
5.3 理解底层后的助记
- 不管变量在++前还是后,自增操作都是优先执行。
- 当变量在++前时,表达式取自增前的值参加运算。
- 当变量在++后时,表达式取自增后的值参加运算。
- i++
ILOAD 1
IINC 1 1
- ++i
IINC 1 1
ILOAD 1
这是最本质的区别,什么都说清楚了。
public class JavaPlusPlus {
public static void main(String args[]) {
int x=0;
x = (++x) + (++x);
System.out.println(x);
}
}
// access flags 0x9
public static main([Ljava/lang/String;)V
L0
LINENUMBER 6 L0
ICONST_0 //将数字0压入操作数栈栈顶。
ISTORE 1 //将栈顶数字从栈弹出到局部变量表索引为1位置,即保存到X。
L1
LINENUMBER 7 L1
IINC 1 1//直接在局部变量表索引为1位置,直接增加1。IINC,I代表整数,INC是增长的英文缩写,1是变量表索引号,1是增加1。
ILOAD 1//将局部变量表索引为1位置的值压到栈顶,即将X的值压入栈。
IINC 1 1//直接在局部变量表索引为1位置,直接增加1。IINC,I代表整数,INC是增长的英文缩写,1是变量表索引号,1是增加1。
ILOAD 1//将局部变量表索引为1位置的值压到栈顶,即将X的值压入栈。
IADD//将栈顶的头两个值相加,并把结果压入栈。
ISTORE 1//将栈顶数字从栈弹出到局部变量表索引为1位置,即保存到X。
L2
LINENUMBER 8 L2
GETSTATIC java/lang/System.out : Ljava/io/PrintStream;
ILOAD 1
INVOKEVIRTUAL java/io/PrintStream.println (I)V
L3
LINENUMBER 9 L3
RETURN
L4
LOCALVARIABLE args [Ljava/lang/String; L0 L4 0
LOCALVARIABLE x I L1 L4 1
MAXSTACK = 2
MAXLOCALS = 2
}