前面都写了9篇啦,虽然断断续续发了半个月,写着写着会发现每篇中都有些比较重要的地方没有讲到~这篇还是需要填一填目前我已发现的坑了~
一、 小结
- Java编译命令 javac、运行命令java
- java默认字符编码为Unicode
- Java程序从main方法开始
- 每一个语句都需要以英文分号结束。
- 程序会被{}划分出范围。
- 类型与方法都需要定义在{}中
- 对于空格通常不影响代码运行
- Java 中的标识符就是类名、变量名、方法名、包名。
- 关键字、保留字全部都是小写,比如null。
- 变量名可以由字母、数字、下划线、美元符组成,但标识符不能以数字开头,也不能是关键字,区分大小写。
- 变量类型分为基本数据类型和引用数据类型
- byte的取值范围是-128~127
- 常量定义之后,不会改变
- 注释有//、/**/、/** ... */
- 运算符涉及到优先级,建议加好()
- =号是赋值,==号是相等
- 选择结构的条件必须为布尔表达式,返回值必须为true或者false
- break会使程序跳出循环,continue只会跳过该次循环。
- System.out.print()是输出语句,System.out.println()是自带换行
- 1字节(byte) = 8位(bit)
二、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,也是一样。
//短路与,第一个操作数的值为false,则不需要在计算后面的操作数 boolean a = 1>2&&2<(3/0);//如果不短路,则会抛出异常(被除数为0) System.out.println(a); //短路与,第一个操作数的值为true,则不需要在计算后面的操作数 boolean b = 1<2||2<(3/0); System.out.println(b);
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定义
1. 常量——常量,定义后无法更改的截图~
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. 二元运算规则
1. 整数运算
- 如果两个数有一个为long,结果类型为long
- 两个操作数没有long时,不管原来是什么类型,结果为int类型
2. 浮点运算
- 如果两个数有一个为double,结果类型为double
- 只有两个数都是float的时候,结果才是float
4. 取余运算
- 取余的余数的正负取决于左边的数
5. 关系运算
- ==、!=是所有(基本&引用)数据类型都能使用
- >、>=、<、<=只有数值类型(整型和浮点型)以及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. 类型转换
1. 自动类型转换
容量小的数据类型可以自动转换成容量大的数据类型(容量是说的范围哦,转换时会损失一定的精度)
整型常量可以直接赋值给 byte、 short、 char 等类型变量,但是要求不超出其范围。
2. 在进行相对变量类型来说较大数值的计算的时候,要注意自动转换引起的数据溢出问题:
输出结果:
暂时先补充到这儿~以后发现没写到的再进行补充说明。
以上,阿里嘎多,20190420 from ahanwhite。