《Java和Android开发学习指南(第二版)》第1~3章学习笔记

第一章 Java 基础

第一章比较简单,主要讲的是下载安装java,写HelloWorld程序以及介绍编码惯例和集成开发环境。
在这一章的学习实践中,我主要遇到了2个问题:jdk11和jdk8的区别,jdk与jre的关系。

问题一:jdk11与jdk8的区别

由于之前安装过jdk8,所以这次在配置环境变量的时候也习惯性的在配置文件里加了一行
export JRE_HOME=${JAVA_HOME}/jre
但是后来检查解压后的jdk目录时发现与jdk8不同的是,jdk11的目录下并没有jre。
《Java和Android开发学习指南(第二版)》第1~3章学习笔记

查了一下,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 的目录截图:
《Java和Android开发学习指南(第二版)》第1~3章学习笔记

jdk 的子目录下也存在一个 jre:
《Java和Android开发学习指南(第二版)》第1~3章学习笔记

这两个 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中,用关键字 final 来声明一个常量。
按照惯例,常量名都是大写的,单词之间用下划线隔开。

字面值

表示一个值的源代码叫做字面值。

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:
long a = 10;
int b = (int) a;

例2:
long a = 9876543210L;
int b = (int) a;

例1不会导致信息丢失,例2会导致信息丢失,会使程序引入一个缺陷。

操作符

一元操作符

自增操作符++

++x:先输出x再自加
x++:先自加再输出x
例1:
int x = 4;
int y = ++x;
//y = 5, x = 5

例2:
int x = 4;
int y = x++;
//y = 4, x = 5

自减操作符--

--x:先输出x再自加
x--:先自加再输出x
例1:
int x = 4;
int y = --x;
//y = 3, x = 3

例2:
int x = 4;
int y = x--;
//y = 4, x = 3

逻辑取反操作符!

例:
boolean x = false;
boolean y = !x;
//此时y为true,x为false

位取反操作符~

例:
boolean j = 2; //2的二进制0000 0000 0000 0000 0000 0000 0000 0010
boolean k = ~j; //取反之后二进制为1111 1111 1111 1111 1111 1111 1111 1101(即十进制的-3)
//此时k=-3, j=2

条件操作符

&& 操作符

&& 操作符接受两个表达式作为操作数,二者均必须返回一个可以转换为一个布尔类型的值,若二者均为真,那么它返回真,否则返回假。

|| 操作符

|| 操作符接受两个表达式作为操作数,二者均必须返回一个可以转换为一个布尔类型的值,若二者至少有一个为真,那么它返回真,否则返回假。

?: 操作符

?: 操作符有3个操作数。语法如下:
expression1 ? expression2 : expression3
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)

控制台将打印如下内容:
0
1
2

for 语句

例:

for(int i = 0; i < 3; i += 2) {
    System.out.println(i);
}

控制台将打印如下内容:
0
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:0
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:0
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

《Java和Android开发学习指南(第二版)》第1~3章学习笔记

上一篇:C++ delete []p 数组指针,如何知道该数组大小的


下一篇:Android XML组件资源整体配置