第一章 Java 基础
第一章比较简单,主要讲的是下载安装java,写HelloWorld程序以及介绍编码惯例和集成开发环境。
在这一章的学习实践中,我主要遇到了2个问题:jdk11和jdk8的区别,jdk与jre的关系。
问题一:jdk11与jdk8的区别
由于之前安装过jdk8,所以这次在配置环境变量的时候也习惯性的在配置文件里加了一行
但是后来检查解压后的jdk目录时发现与jdk8不同的是,jdk11的目录下并没有jre。
查了一下,jdk11中,Oracle不再提供JRE和Server JRE下载,其实 jdk 本身也包含了 jre ,单独再下载一个外置 jre 是为了使 jdk 版本稳定,让外置 jre 独立更新(一般推荐稳定版的jre8),但是不下载也不会运行不了Java程序。
于是,又有一个问题出现了,之前的 jdk 本身包含了一套 jre ,再单独下载另一个版本的 jre ,运行java程序的时候不会发生版本冲突吗?
我们先来看看 jdk 和 jre 之间的关系:
问题二:jdk与jre的关系
jre (java runtime environment),是java程序的运行环境。安装过程中,会自动添加PATH。面向Java程序的使用者,而不是开发者。
jdk (java development kit),是java的开发工具包。集成了 jre 、各种类库和工具,例如:javac.exe,java.exe,jar.exe 等。需要配置环境变量。
注:eclipse、idea等其他IDE有自己的编译器而不是用jdk bin目录中自带的,所以在安装时你会发现他们只要求你选中jre路径。
即 jdk > jre
以下是之前在windows下安装 jdk8 的目录截图:
jdk 的子目录下也存在一个 jre:
这两个 jre 用哪个都行,我们在安装 jdk 的时候可以选择不再安装 jre 而直接使用 jdk 中的 jre 运行我们的 Java 程序,只是刚开始装的时候不清楚 jdk 和 jre 之间的关系,默认两个都安装上了。但如果不开发,只是部署和运行 Java 程序的话,那么只需要安装 jre 即可,无需安装 jdk 。
在 jdk 的 bin 目录下,基本上都是一些小的可执行文件,其实它们只是一层包装器,例如 javac.exe 内部调用的其实是 jdk 的 lib 目录中的 tools.jar 中 com.sun.tools.javac.Main 类,也就是说这些小的可执行文件只是入口而已,这样做的目的是避免输入的命令过长。实际上它们本身又都是由 Java 编写的,也需要由 jre 来提供运行时环境,所以在 jdk 目录下的 jre 既提供了这些工具的运行时环境,也提供了我们编写完成的 Java 程序的运行时环境。
那么,当一台电脑安装两套以上的jre在运行程序时如何选择呢?由java.exe找到合适的jre来运行Java程序。
Java.exe依照底下的顺序来查找jre:自己的目录下有没有 jre → 父目录下有没有 jre → 在PATH路径中找 jre (一般运行时从path中查找,按照path设置前后顺序,以前面为准) → 查询注册表: [HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Java Runtime Environment]
最常用的是在PATH路径中找jre,一般情况下,自己的程序运行之前都会先在批处理文件里面临时设置PATH,把自己用的jre放到PATH路径最前面,所以肯定会运行自己带的jre,不会造成版本混乱。
第二章 语言基础
Java 数据类型
Java有两种数据类型,引用类型和基本类型。
一个引用类型的变量提供对一个对象的引用,一个基本类型的变量保存一个基本类型。
常量
在Java中,用关键字
按照惯例,常量名都是大写的,单词之间用下划线隔开。
字面值
表示一个值的源代码叫做字面值。
1.整数字面值
十进制9的字面值:9
十六进制9E的字面值:0x9E或0X9E
八进制567的字面值:0567
注:若整数字面值过长可在中间唯一位置用下划线将数字隔开,如:1000000可表示为1_000_000。
2.浮点数字面值
float字面值有如下格式:
Digits .[Digits] [ExponentPart] f_or_F
.Digits [ExponentPart] f_or_F
Digits ExponentPart f_or_F
Digits [ExponentPart] f_or_F
注:[]之间的部分是可选的。
举例:2e1f, 9.f, .5f, 0f, 3.14f, 9.0001e+12f
double字面值有如下格式:
Digits .[Digits] [ExponentPart] [d_or_D]
.Digits [ExponentPart] [d_or_D]
Digits ExponentPart [d_or_D]
Digits [ExponentPart] [d_or_D]
举例:2e1, 8.,.5,0.0D,3.14,9e-9d,7e123D
3.布尔字面值
布尔类型有两个值,字面值分别为true和false。
基本类型转换
加宽转换
如下情况进行加宽转换:
- byte->short/int/long/float/double
- short->int/long/float/double
- char->int/long/float/double
- int->long/float/double
- float->double
加宽转换是隐式地发生的,不需要在代码中做任何事情。
收窄转换
如下情况进行收窄转换:
- short->byte/char
- char->byte/short
- long->byte/short/char
- float->byte/short/char/int/long
- double->byte/short/char/int/long/float
收窄转换必须是显式的,需要圆括号中指定目标类型。
例1:
int b = (int) a;
例2:
int b = (int) a;
例1不会导致信息丢失,例2会导致信息丢失,会使程序引入一个缺陷。
操作符
一元操作符
自增操作符++
++x:先输出x再自加
x++:先自加再输出x
例1:
int y = ++x;
//y = 5, x = 5
例2:
int y = x++;
//y = 4, x = 5
自减操作符--
--x:先输出x再自加
x--:先自加再输出x
例1:
int y = --x;
//y = 3, x = 3
例2:
int y = x--;
//y = 4, x = 3
逻辑取反操作符!
例:
boolean y = !x;
//此时y为true,x为false
位取反操作符~
例:
boolean k = ~j; //取反之后二进制为1111 1111 1111 1111 1111 1111 1111 1101(即十进制的-3)
//此时k=-3, j=2
条件操作符
&& 操作符
&& 操作符接受两个表达式作为操作数,二者均必须返回一个可以转换为一个布尔类型的值,若二者均为真,那么它返回真,否则返回假。
|| 操作符
|| 操作符接受两个表达式作为操作数,二者均必须返回一个可以转换为一个布尔类型的值,若二者至少有一个为真,那么它返回真,否则返回假。
?: 操作符
?: 操作符有3个操作数。语法如下:
expression1必须返回一个能转换为布尔类型的值,若expression1为真,返回expression2,否则返回expression3。
例如 (8<4)?2:4 返回4。
位移操作符
- 向左位移操作符<<
- 向右位移操作符>>
- 无符号位向右位移操作符>>>
赋值操作符
= += -+ *= /= %= <<= >>= >>>= &= ^= |=
逻辑操作符 &|^
& 表示一个AND操作
| 表示一个OR操作
^ 表示一个异或操作
第三章 语句
在Java中,空语句是合法的,它什么也不做,如下所示:
;
if 语句
例:
if (a==1){
System.out.println("a=1");
} else if (a==2){
System.out.println("a=2");
} else {
System.out.println("invalid");
}
while 语句
例:
int k = 0;
while(true) {
System.out.println(k);
k++;
if(k>2){
break;
}
}
do-while 语句
例:
int i = 0;
do {
System.out.println(i);
i++;
} while (i<3)
控制台将打印如下内容:
1
2
for 语句
例:
for(int i = 0; i < 3; i += 2) {
System.out.println(i);
}
控制台将打印如下内容:
2
break 语句
break终止循环的时候不会执行语句块中剩下的语句。
例:
start:
for(int i=0;i<3;i++){
for(int j=0;j<4;j++){
if(j==2){
break start;
}
}
System.out.println(i+":"+j);
}
标签start用来表示第一个for循环,break start将会终止第一个循环。
控制台将打印如下内容:
0:1
continue 语句
continue终止当前的迭代的执行,并且导致控制转向下一次迭代中。
例:
start:
for(int i=0;i<3;i++){
for(int j=0;j<4;j++){
if(j==2){
continue start;
}
}
System.out.println(i+":"+j);
}
标签start用来表示第一个for循环,break start将会终止第一个循环。
控制台将打印如下内容:
0:1
1:0
1:1
2:0
2:1
switch 语句
switch语句的语法如下所示:
switch(expression){
case value_1 :
statement(s);
break;
}
case value_2 :
statement(s);
break;
}
...
case value_n :
statement(s);
break;
}
default:
statement(s);
}
参考
https://ihyperwin.iteye.com/blog/1513754
https://blog.csdn.net/qq_35326718/article/details/79443911