❓首先来考虑一个问题,我们编写Java程序以及编译之后是直接交给计算机去运行的吗
🙅不是的,实际上,我们是通过JVM,JVM再将编译后的字节码交给计算机。
所以,我们让Java程序跑起来的步骤实际上是
- Java Code —- Compiler —-> Java Bytecode 先由编译器将代码编译为字节码
- Java Bytecode —- JVM —-> Machine code 再由JVM将字节码转换为机器码
总结:总的来说,我们编写的代码由编译器编译为字节码,JVM在根据不同的操作系统(平台),将字节码转为机器码以保证程序正确运行。所以说,Java是 plate-form independent的。
JRE实际上是JVM的一个超集,因为它出了包含JVM以外,它还提供了一些Java类包以及其他的一些必要模块。如果你只需要运行Java程序,但不想编程Java程序,那么JRE是你最好的选择。
JDK(Java Development Kit)是一个整合的开发工具,当你下载了JDK之后,JRE也会同时下载。同时,它还包含(compilers, JavaDoc, Java Debugger, etc)。
一个变量存储在内存中以维持数据,为了区分保存的位置,每一个变量都有一个唯一的标识(变量名) identifier
。
Identifier的格式:
$
或者 _
开头,开头不能是数字@
, #
, and so on.关键字 | ||||
---|---|---|---|---|
abstract | assert | boolean | break | byte |
case | catch | char | class | const |
continue | default | do | double | else |
enum | extends | final | finally | float |
for | goto | if | implements | import |
instanceof | int | interface | long | native |
new | package | private | protected | public |
return | short | static | strictfp | super |
switch | synchronized | this | throw | throws |
transient | try | void | volatile | while |
Java是静态类型语言,也就是说所有的变量在赋值前都需要被
声明
int speedLimit; speedLimit = 80;
字面量用于标识固定的数值,在代码中他们可以被直接使用
int a = 1;
float b = 2.5;
char c = 'F';
这里的1
,2.5
以及F
就是字面量,Java中有以下几种字面量
Java有8个原始数据类型
,其他的为引用类型
boolean
type:true or falsebyte type
:from -128 to 127, 8-bitshort type
:from -32768 to 32767, 16-bit
int type
:from $-2^{31}$ to $2^{31}-1$, 32-bit
long type
:from $-2^{63}$ to $2^{63}-1$, 64-bit
double type
:64-bit floating-pointfloat type
:32-bit floating-pointchar type
:16-bit Unicode character from \u0000 to \uffff❓既然float和double都是浮点数,那么我们知道字面量是double还是float呢?
To tell the compiler to treat
-42.3
asfloat
rather thandouble
, you need to use f or F.Notice that, we have used
-42.3f
instead of-42.3
in the above program. It’s because-42.3
is adouble
literal.class Main { public static void main(String[] args) { float number = -42.3f; System.out.println(number); // prints -42.3 } }
Java的运算操作主要分为5类
Operator | Operation |
---|---|
+ |
Addition 加法 |
- |
Subtraction 减法 |
* |
Multiplication 乘法 |
/ |
Division 除法 |
% |
Modulo Operation (Remainder after division) 求余 |
如果我们对两个整数进行除法操作,那么结果为整数(舍去分数)
如果操作中其中一个是浮点数,那么结果也为浮点数
Operator | Example | Equivalent to |
---|---|---|
= |
a = b; |
a = b; |
+= |
a += b; |
a = a + b; |
-= |
a -= b; |
a = a - b; |
*= |
a *= b; |
a = a * b; |
/= |
a /= b; |
a = a / b; |
%= |
a %= b; |
a = a % b; |
Operator | Description | Example |
---|---|---|
== |
Is Equal To | 3 == 5 returns false |
!= |
Not Equal To | 3 != 5 returns true |
> |
Greater Than | 3 > 5 returns false |
< |
Less Than | 3 < 5 returns true |
>= |
Greater Than or Equal To | 3 >= 5 returns false |
<= |
Less Than or Equal To | 3 <= 5 returns false |
Operator | Example | Meaning | ||||
---|---|---|---|---|---|---|
&& (Logical AND) |
expression1 && expression2 | true only if both expression1 and expression2 are true |
||||
` | ` (Logical OR) | expression1 **` | `** expression2 | true if either expression1 or expression2 is true |
||
! (Logical NOT) |
!expression | true if expression is false and vice versa |
Operator | Meaning |
---|---|
+ |
Unary plus: not necessary to use since numbers are positive without using it |
- |
Unary minus: inverts the sign of an expression |
++ |
Increment operator: increments value by 1 |
-- |
Decrement operator: decrements value by 1 |
! |
Logical complement operator: inverts the value of a boolean |
Operator | Description |
---|---|
~ |
Bitwise Complement |
<< |
Left Shift |
>> |
Right Shift |
>>> |
Unsigned Right Shift |
& |
Bitwise AND |
^ |
Bitwise exclusive OR |
instanceof
:str instanceof String
判断str是不是String类的实例
variable = Expression ? expression1 : expression2
Java的标准输出
print()
- It prints string inside the quotes.println()
- It prints string inside the quotes similar likeprint()
method. Then the cursor moves to the beginning of the next line.printf()
- It provides string formatting (similar to printf in C/C++ programming).
Java的标准输入
import java.util.Scanner;
// create an object of Scanner
Scanner input = new Scanner(System.in);
// take input from the user
int number = input.nextInt();
由Scanner类创建的 input 对象拥有类似
nextInt
的方法
- nextLong()
- nextFloat()
- nextDouble()
同时在结束输入后不能忘记调用
close()
方法关闭对象
你可以把包看成一个容器,它把各种类型(类、接口、枚举、注解)组合在一起。举一个例子,如果ResultSet
接口在java.sql
的包中,如果你想要使用这个接口,那么你就需要从包中引入import java.sql.ResultSet
。
❓为什么要引入包的概念呢?
🙋♂️:包就像C中的命名空间一样,有了命名空间我们就可以区分两个命名相同的类或者接口。比如,我们有两个
Date
类型:java.util.Date
和java.sql.Data
,有了包我们就在避免冲突的前提下,同时使用这两个类。
我们在下载JDK的时候,同时也下载了一些包:java.lang
, java.util
, java.io
,我们不需要重新去下载这些包,因为他们是(自带的)。e.g. import java.util.ArrayList;
通过package
关键字,我们可以定义一个包
package packageName;
Java使用系统的相对文件路径来定义一个包
# 假设我们的文件结构如下
└── com
└── test
└── Test.java
那么对于Test.java
这个类,我们的包就为package com.test
,通常我们用域名来创建包,以保证唯一。
我们可以通过IntelliJ IDEA
右键生成包来创建包
本文由 Frank采用 署名 4.0 国际 (CC BY 4.0)许可
Java — 2021年4月12日
Made with ❤ and at Hangzhou.