前面都写了 9 篇啦,虽然断断续续发了半个月,写着写着会发现每篇中都有些比较重要的地方没有讲到~ 这篇还是需要填一填目前我已发现的坑了~
一、 小结
- Java 编译命令 javac、运行命令 java
- java 默认字符编码为 Unicode
- Java 程序从 main 方法开始
- 每一个语句都需要以英文分号结束。
- 程序会被 {} 划分出范围。
- 类型与方法都需要定义在 {} 中
- 对于空格通常不影响代码运行
- Java 中的标识符就是类名、变量名、方法名、包名。
- 关键字、保留字全部都是小写,比如 null。
- 变量名可以由字母、数字、下划线、美元符组成,但标识符不能以数字开头,也不能是关键字,区分大小写。
- 变量类型分为基本数据类型和引用数据类型
- byte 的取值范围是 - 128~127
- 常量定义之后,不会改变
- 注释有 //、//、/ ... */
- 运算符涉及到优先级,建议加好 ()
- = 号是赋值,== 号是相等
- 选择结构的条件必须为布尔表达式,返回值必须为 true 或者 false
- break 会使程序跳出循环,continue 只会跳过该次循环。
- System.out.print() 是输出语句,System.out.println() 是自带换行
二、Java 的编译运行
写好源代码之后,我的学习记录里只有写到怎么用,却没有去详细解释流程,如此就造成了一些知其然而不知其所以然的问题,so,这里补充上:
首先,需要给几个定义:
Java 虚拟机(JVM):是可以运行 Java 代码的虚拟计算机。只要电脑上安装有 Java 环境,就拥有 JVM 虚拟机。
字节码(Byte-code):是一种包含执行程序,由一序列 op 代码 / 数据对组成的二进制文件,是一种中间码。(百科)
机器码:指的是将硬件序列号经过一系列加密、散列形成的一串序列号。(百科)
1. 编译
写好代码后,保存的为 .java 文件,用 javac.exe(编译器)编译之后,编译器会先检查错误:
如果有错,则编译无法完成,需要修改,直至修改到没错了,才能通过。
如果没错,通过编译,产出一个字节码文件(.class)。
so,编译器:将 Java 源文件(.java)编译成字节码文件(.class 文件,是特殊的二进制文件,二进制字节码文件)
字节码文件与平台是无关的,这也是 JVM 的平台无关性的来源。
2. 解释
编译完成后,JVM 操作解释器将产生的字节码文件来解释。
解释器解释字节码的过程,就是将字节码文件解释成本机能够识别的机器码。
机器码与平台是有关的,不同平台的机器码不同。
解释由分成以下步骤:
首先,通过类加载器(class loader)将所有代码装入解释器。
然后,被装入的代码由字节码校验器进行检查,若无错误,则进入下一步。
3. 执行
Java 字节码开始执行,这个也有两种方式:
a. 即时编译方式:先将字节码编译成机器码,再执行该机器码。
b. 解释执行方式:解释器通过每次解释并执行一小段代码来完成 Java 字节码程序的所有操作。
通常情况下回采用解释执行方式,这样会使字节码翻译成机器码有更高的效率。当然,对于对运行速度要求较高的应用程序,还是选择即时编译比较好,可以很好的保证 Java 代码的可移植性以及高性能。
三、变量的声明与初始化
在程序运行的过程中,内存有一部分的空间是变化的,这个空间就叫变量。那么声明变量就是申请了一个内存空间。内存空间在开辟之时,如果没有赋值的话,内存空间会根据变量的类型来设置默认值。

如果有赋值的话,就会将值存入内存空间,否则就是默认值。变量的用处:存放数据。
int i; // 声明变量。申请了一个内存空间,当前为int的默认值0
i = 1; // 初始化变量。将i赋值为1
四、引用类型
对于引用类型来说,其默认值是 null,没有任何指向的内存空间。
那么数组也是引用类型,在声明的时候如果没有直接给元素的话,那么其默认值为 null。

五、逻辑运算符
关于逻辑运算符 &&、|| 两者,有一点要十分注意:
这两个存在一个短路问题,意思就是前面第一个条件已经能够使表达式得出结果了,后面的条件就不用判断了。
比如:1>2&&2>1,那么这个因为 1>2 已经为假了,&& 要求两个都为真才能返回 True,所以后面的条件就不用计算,直接出返回结果。2>1 || 1>2,也是一样。
20190421 补充 已补
A. 注释:
1. 注释不会出现在字节码文件中,即 Java 编译器编译时会跳过注释语句。
2. 多行注释的小技巧:可以当成行内注释使用,不会影响到后面的代码执行
B. 标识符
1. 因为 Java 采用的是 Unicode 编码,Unicode 编码中也有汉字,所以用中文是可以的,但是不建议使用

C. 变量
1. 不建议一行定义多个变量
2. 浮点型变量的表示
十进制:1.109、11.09、110.9、1109、110900
科学计数法:1109e-3,、1109E-2、1109E-1、1109、1109E2
aEb:a 乘 10 的 b 次方
3. 浮点数是不精确的,一定不要用于比较!
float f = 0.1f;
double d = 1.0 / 10;
System.out.println(f == d); // 结果为false
float d1 = 423432423f;
float d2 = d1 + 1;
if (d1 == d2) {
System.out.println("d1==d2");// 输出结果为d1==d2
} else {
System.out.println("d1!=d2");
}
如果非要进行比较的话,可以使用 java.math 包下的 BigInterger 类以及 BigDecimal 类。
BigInterger 实现了任意精度的整数运算、BigDecimal 实现了任意精度的浮点运算
BigDecimal bd2 = BigDecimal.valueOf(0.1);
BigDecimal bd3 = BigDecimal.valueOf(1.0/10.0);
System.out.println(bd2.equals(bd3));
4. char 型变量只能用单引号,不能用双引号。可以使 (int) 变量或者 0 + 变量来转成数字。String 是字符序列(引用类型)
5. boolean 型变量在选择结构中,直接写:if(变量){} 即可,不推荐写成:if(变量 ==true){}
D. 数据类型

boolean 的大小:理论上占一位,实际上单个的 boolean 类型在编译的时候使用的是 int 类型,占 4 个字节即 32 位,在数组中每一个 boolean 在 JVM 中占一个字节。转自:https://blog.csdn.net/u010642004/article/details/50099913
E. 常量
用 final 定义

2. Java 中整型变量的四种表现形式:
二进制整数:0b01111101(要求以 0b 或 0B 开头)
八进制整数:023(要求以 0 开头)
十进制整数:99,-100
十六进制证书:0x15(要求以 0x 或 0X 开头)
int a = 0b1101; //以0b开头是二进制
int b = 0117; //以0开头是八进制
int c = 17;
int d = 0x1f; //以0x开头是16进制
System.out.println("二进制:"+a);
System.out.println("八进制:"+b);
System.out.println("十进制:"+c);
System.out.println("十六进制:"+d);


F. 二元运算规则
- 整数运算
- 如果两个数有一个为 long,结果类型为 long
- 两个操作数没有 long 时,不管原来是什么类型,结果为 int 类型
- 浮点运算
- 如果两个数有一个为 double,结果类型为 double
- 只有两个数都是 float 的时候,结果才是 float
- 取余运算
- 取余的余数的正负取决于左边的数
- 关系运算
- ==、!= 是所有(基本 & 引用)数据类型都能使用
- >、>=、<、<= 只有数值类型(整型和浮点型)以及 char 能够使用。
6. 字符串连接符 “+”
之前代码中经常出现 “System.out.println("xx="+a);”,这样的输出语句,为了提示方便,所以我会在输出变量前加上字符串,然后会有一个加号,这个加好就是字符串连接符。
在使用 “+” 运算符连接字符串和 int 型(或 double 型)数据时,“+” 将 int(或 double)型数据自动转换成 String 类型:(遇到字符串后,往后一行全是连接,括号里的除外(谁让括号是老大呢))
System.out.println(3+4);// 7
System.out.println(3+"4");// 3(连接)"4" = 34
System.out.println(3+4+"5");// 3(加法)4(连接)"5" = 75
System.out.println(3+4+3+"4");// 3(加法)4(加法)3(连接) "4" = 104
System.out.println(3+4+4+"3"+3);// 3(加法)4(加法)4 (连接) "3" (连接)3 = 1133
这个能看懂嘛⁄(⁄⁄•⁄ω⁄•⁄⁄)⁄
字符串连接符还有一个作用:当字符串很长的时候,可以用字符串连接符分成好几行来写:
System.out.println("我太长啦"
+ "真的,"
+ "不得不分成好几行来写!");
当然,+ 号叫字符串连接符,对于 char 字符型来说,它还是加法哈:(a 在编码中为 97)
System.out.println('a');//a
System.out.println(4+'a');//4+97=101
20190422 补充
A. 类型转换
- 自动类型转换

整型常量可以直接赋值给 byte、 short、 char 等类型变量,但是要求不超出其范围。
- 在进行相对变量类型来说较大数值的计算的时候,要注意自动转换引起的数据溢出问题:
int money = 100000000; //1亿
int years = 22;
//int类型大约为21亿,wage为22亿,超过了int的范围
int wage = money*years;
System.out.println("wage="+wage);
//因为是两个int值相乘,所以结果仍然为int值,在转成long之前就已经造成了数据溢出
long wage1 = money*years;
System.out.println("wage="+wage1);
//先将一个数变成long,以long型与int型进行计算,结果自动转为long型
long wage2 = money*((long)years);
System.out.println("wage="+wage2);
输出结果:
所以建议大家在做运算的时候,如果结果有溢出的可能就将第一个操作数转型为更大的数据类型。
暂时先补充到这儿~ 以后发现没写到的再进行补充说明。
以上,阿里嘎多,20190420 from ahanwhite。