Java基础学习2-表达式、控制流与I/O

Made by Mike_Zhang


Java主题:


本文将记录Java基础学习的三大内容 - 表达式 (Expressions)控制流 (Control Flow)I/O


1. 表达式 (Expressions)

1.1 转义字符 (Escape Character)

转义字符 (Escape Character) 描述 解释
‘\n’ new line 换行-光标移动至下一行开头
‘\t’ tab 水平移动-光标移动至下一个TAB后
‘\b’ backspace 退格(删除)-光标移动至前一列
‘\r’ return 回车-光标移动至本行开头
‘\f’ form feed 换页-光标移动至下页开头
‘\\\’ backslash
‘\‘’ single quote
‘\“‘ double quote
‘\0’ null
‘\000’ 1-3位八进制数 范围\000~\377
‘\u0000’ Unicode字符 4位16进制数 (‘\u0000’为空字符) 范围0~65535

运行以下代码:

1
2
3
4
5
6
7
8
9
10
public class JavaLearningTwo {
public static void main(String[] args){
System.out.println("1. Hello World!\n");
System.out.println("2. \tHello World!");
System.out.println("3. Hello World!\b");
System.out.println("4. Hello World!\rHi World!");
System.out.println("5. Hello World!\f");
System.out.println("6. Hello World!");
}
}

输出:

1
2
3
4
5
6
7
1. Hello World!

2. Hello World!
3. Hello World
Hi World!
5. Hello World!
6. Hello World!

1.2 运算符 (Operator)

1.2.1 数字运算符 (Arithmetic Operator)

数字运算符 (Arithmetic Operator) 描述
+ addition
- subtraction
$*$ multiplication
/ division
% modulo (take the remainder)

1.2.2 字符串连接符 (String Concatenation)

$+$为字符串连接符 (String Concatenation),例子如下:

1
2
3
4
String aString = "This";
String bString = "is";
String cString = aString + bString;
Stirng dString = cStirng + "my book"; // dString = "This is my book"

1.2.3 自增与自减运算符 (Increment and Decrement Operator)

例如:

1
2
3
4
int i = 1;
int j = i++;
// ...
int k = i--;

类似于:
1
2
3
4
5
6
int i = 1;
int j = i;
i = i + 1;
// ...
int k = i;
i = i - 1;

上面的例子中,自增或自减符号位于变量后,则先进行赋值操作,再对变量进行自增或自减。若自增或自减符号位于变量前,则先对变量进行自增或自减,再进行赋值操作。如下:

1
2
3
4
int i = 1;
int j = ++i;
// ...
int k = --i;

类似于:

1
2
3
4
5
6
int i = 1;
i = i + 1;
int j = i;
// ...
i = i - 1;
int k = i;

1.2.4 逻辑运算符 (Logical Operator)

数字逻辑运算符 描述
< less than
<= less than or equal to
> greater than
>= greater than or equal to
== equal to
!= not equal to
布尔逻辑运算符 描述 例子
! not(prefix) !true = false
&& AND true && false = false
|| OR true || false = true
^ Exclusive OR true ^ false = true

1.2.5 位运算符 (Bitwise Operator)

假设:

1
2
byte a = (byte)0B10101010;
byte b = (byte)0B00100000;

位运算符 (Bitwise Operator) 描述 例子
complement (byte)~a = 0B01010101
& AND (byte)(a & b) = 0B00100000
OR (byte)(a | b) = 0B10101010
^ Exclusive OR (byte)(a ^ b) = 0B10001010
<< Signed left shift, fill with 0 (bytr)(a << 2) = 0B10101000
>> Signed right shift, fill with sign bit (bytr)(a >> 2) = 0B11101010
>>> Unsigned right shift, fill with 0 (bytr)(a >> 2) = 0B00101010

1.2.6 赋值运算符 (Assignment Operator)

=为赋值符号,把一个值赋值给某一变量,语法如下:

variable = expression

例子:
i = 2;

以下情况会从右往左进行赋值:
i = j = 3;
相当于:
j = 3;
i = j;

1.2.7 复合赋值运算符 (Compound Assignment Operator)

语法如下:
variable op= expression

相当于:
variable = variable op expression

例如:
i =+ 1; 相当于:i = i + 1

若出现下列的表达式,则需要根据运算符号优先级来判断运算顺序:

i = j += (k * 2) / 8

运算符号优先级详见1.2.9节。

1.2.8 条件表达式 (Conditional Expression)

语法如下:
boolean-expression ? exp1 : exp2

例如:

1
2
System.out.println((num % 2 == 0)? "EVEN" : "ODD")

解释:
如果 boolean-expression == true 那么整个表达式等于exp1,否则等于exp2

1.2.9 运算符优先级 (Operator Precedence)

运算符 描述 级别 运算方向
[ ] access array element 1 L to R
. access object member 1 L to R
( ) invoke a method 1 L to R
++ post-increment 1 L to R
post-decrement 1 L to R
++ pre-increment 2 R to L
pre-decrement 2 R to L
+ unary plus 2 R to L
- unary minus 2 R to L
! logical NOT 2 R to L
~ bitwise NOT 2 R to L
( ) cast 3 R to L
new object creation 3 R to L
* multiplication 4 L to R
/ division 4 L to R
% modulo 4 L to R
+ - addition, subtraction 5 L to R
+ string concatenation 5 L to R
<< >> >>> shift 6 L to R
< <= > >= instanceof relational type comparison 7 L to R
== != equality 8 L to R
& bitwise AND 9 L to R
^ bitwise XOR 10 L to R
bitwise OR 11 L to R
&& conditional AND 12 L to R
|| conditional OR 13 L to R
?: conditional 14 R to L
= += -= *= /= %= &= ^= |= <<= >>= >>>= assignment 15 R to L

2. 控制流 (Control Flow)

2.1 条件语句 (Conditional Statement)

2.1.1 if 表达式

语法如下:

1
2
3
4
if (booleanExpression)
trueBody
else
falseBody
1
2
3
4
5
6
if (firstBooleanExpression)
firstBody
else if (secondBooleanExpression)
secondBody
else
thirdBody

trueBodyfalseBodyfirstBodysecondBodythirdBody可以为单行的语句或者是语句块(写在{}内),例如:

1
2
3
4
5
6
7
if (booleanExpression){
trueBody1
trueBody2
trueBody3
}
else
falseBody

2.1.2 switch 表达式

语法如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
switch(selector) { 
case value1:
statement;
break;
case value2:
statement;
break;
case value3:
statement;
break;

// ...
default:
statement;
}

selector会与每个value进行比较,若相等则运行后面的statement语句,若没有一个相等的,则运行default之后的语句。 每个case中的break;语句是可选择的,一般选择加上,以便满足case条件后直接退出,若不加,则会运行其之后的语句,直到遇到break;语句再退出。
default 语句后一般不需要break;语句,因为此语句通常放在最后,运行default后会直接退出。但是如果default 语句后还有语句,则需要break;语句。但是不推荐default 语句后再加语句,这违背了初衷,只有前面所有情况都不满足之后再使用default 语句。因此推荐把default 语句放在最后,此时,可选择是否加上break;语句。

selector应为整型数据,如char,byte,short,int,boolean,String或者enum
如需要使用非整型数据,如long,float或者double,则需要使用if语句。


2.2 循环语句 (Loop Statement)

2.2.1 while 循环

语法如下:

1
2
while (booleanExpression)
loopBody

例子:

1
2
3
4
5
int i = 0;
while(i < 5){
System.out.println(i);
i++;
}

2.2.2 do-while 循环

语法如下:

1
2
3
do
loopBody
while (booleanExpression)

例子:

1
2
3
4
5
int i = 0;
do {
System.out.println(i);
i++;
} while(i < 5);

while循环不同的是,每一次do-while循环先执行循环体的语句,最后进行循环条件的判断。这种循环可以实现进入循环后再询问用户的输入,不用在循环前询问。

2.2.3 for 循环

语法如下:

1
2
for (initialization; booleanCondition; increment)
loopBody

例子:

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

for 循环可以转换为while 循环,如下:

1
2
3
4
initialization;
while (booleanExpression)
loopBody;
increment;

2.2.4 for-each 循环

语法如下:

1
2
for (elementType name : container)
loopBody

containerelementType类型的数组,此循环会遍历数组内的元素。例如:

1
2
3
4
int[] arr = {1,2,3,4};
int total;
for (int i : arr)
total += i;

此循环遍历arr数组的全部元素,最后得出其总和。

注意:
for-each 循环并不会访问到具体的元素及其下标,因此以下代码是不合法的:

1
2
3
int[] arr = {1,2,3,4};
for (int i : arr)
i++; // Error

所以如果要进行对具体元素的修改,则需要用for或者while循环,如下:

1
2
3
4
int[] arr = {1,2,3,4};
for (int i = 0; i < arr.length; i++){
arr[i]++;
}


2.2.5 强制跳转 (Unconditional Branching)

return

  1. 当一个方法的返回值被定义为void后,只有运行完此方法的最后一行代码之后才会跳出此方法。但是当一个方法的返回值定义到一个具体的数据类型,当运行到return关键字后就会跳出此方法。
  2. return语句必须是一个方法中最后被执行的语句,其后的语句都不会被执行。return语句行不一定是方法代码的最后一行,但是最后被运行的那一行。如下:
1
2
3
4
5
public int abs(int num){
if(num < 0)
return -num // if negative, return -num and exit the loop
return num // else return num
}

break
break语句可以跳出目前所在的循环体(e.g. for, while, do-while, switch)。跳出后开始执行此循环的后一行代码。


continue
continue语句会跳过其后的本次正在循环的代码,并且开始执行此循环体的下一次循环(如果还满足循环的条件),并不会像break语句一样直接跳出循环体。


3. I/O

3.1 输出 (output)

语法如下:

1
2
System.out.print("Hello,World!");
System.out.println("Hello,World!"); // followed by a newline

System.out对象属于java.io.PrintStream类的一个实例

3.2 输入 (input)

一般语法如下:

1
2
3
4
5
6
7
8
import java.util.Scanner;
public class Example{
public static void main(String[] args){
Scanner input = new Scanner(System.in);
System.out.print("Enter :");
double num = input.nextDouble();
}
}

Scanner会根据分隔符把输入内容分成好几个小节后再进行一一读取。
分隔符一般为whitespace(i.e. space, tabs, and newlines)

Scanner的方法有以下几种:

方法名 解释
hasNext() 如果输入中还有小节,返回true
next() 返回输入中的下一个string小节。若没有小节,返回错误
hasNextType() 如果输入中还有对应的Type类的小节,返回trueType类可为Boolean Byte Double Float Int Long Short
nextType() 返回输入中的下一个Type类小节。若没有小节或者小节不是Type类,返回错误
hasNextLine() 如果输入中还有另外一行文本,返回true
nextLine() 返回一整行的输入到回车结束(包括空格),并把光标移到下一行的开头
findInLine(Stirng s) 尝试寻找输入的一行中是否有给定字符s。 若有则返回此字符并把光标移到此字符后,若无则返回null并且不移动光标。

参考

B. Eckel, Thinking in java. Upper Saddle River, N.Y. Prentice Hall, 2014.
M. Goodrich, R. Tamassia, and A. O’reilly, Data Structures and Algorithms in Java, 6th Edition. John Wiley & Sons, 2014.
Java转义字符, 知乎专栏. https://zhuanlan.zhihu.com/p/30158394 (accessed Sep. 14, 2021).


写在最后

Java相关的基础知识十分重要,会继续学习,继续更新.
最后,希望大家一起交流,分享,指出问题,谢谢!


原创文章,转载请标明出处
Made by Mike_Zhang




感谢你的支持

Java基础学习2-表达式、控制流与I/O
https://ultrafish.io/post/Java-learning-2/
Author
Mike_Zhang
Posted on
September 17, 2021
Licensed under