要掌握并熟练使用Java语言,必须充分了解Java语言的基础知识。本章将针对Java的基本grammar、变量、运算符、方法、结构语句以及数组进行详细地讲解。

2.1 Java的基本语法

每一种编程语言都有一套自己的语法规范,Java语言亦是。要想学好Java语言,首先要熟悉它的基本grammar。

2.1.1 Java代码的基本格式

1.Java中的程序代码必须放在一个类中,可以将其理解为一个Java程序。

①类需要使用class关键字定义,在class前面可以有一些修饰符,格式如下:

修饰符 class 类名{
  程序代码
}

2.编写Java程序的时候,需要注意如下问题:

①Java中的代码分为:结构定义语句、功能执行语句;

---结构定义语句:声明一个类或方法;

---功能执行语句:实现具体的功能;

【每条功能执行语句的最后都必须用分号(;)结束,且必须是英文的分号。】

②Java语言严格区分大小写。

---定义类的时候,不能将class写成Class,否则编译会报错。程序中定义一个computer的同时,还可以定义一个Computer,因为两者是完全不同的符号。

③编写Java代码的时候,为了便于阅读,通常会使用一种良好的格式进行排版,但是这不是必须的,只是为了美观。

④Java程序中一句连续的字符串不能分开在两行中书写,如下,将会在编译的时候出错:

System.out.println("这是第一个
Java程序!");

---如果字符串太长,为了方便阅读,想要将字符串分为两行书写,可以先将这个字符串分成两个字符串,然后用加号(+)将这两个字符串连接起来,在加号(+)处断行。上面本错误的语句就可以修改为如下:

System.out.println("这是第一个"+
"Java程序!");

2.1.2 Java中的注释

在编写程序的时候,为了使code易于阅读,通常会在实现功能的同时为code添加一些注释。注释是对程序的某个功能或某行代码的解释说明,它只在Java源文件中有效,在编译程序时编译器会忽略这些注释information,不会将其编译到字节码文件中去

1.单行注释

通常用于对程序中的某一行code进行解释,用符号“//”表示,“//”后面为注释的content,具体示例如下:

int c = 10;   //定义一个整型变量

2.多行注释

多行注释顾名思义就是在注释中的content可以为多行,它以符号"/*"开头,以符号"*/"结尾,多行注释具体示例如下:

/*int c = 10;
int x = 5;*/

3.文档注释

文档注释以"/**"开头,并在注释内容末尾以“*/”结束。文档注释是对一段code概括的解释说明,可以使用javadoc命令将文档注释提取出来帮助生成文档。

【多行注释中可以嵌套单行注释:

/*int c = 10;     //定义一个整型的c
int x = 5;*/

多行注释中不能嵌套多行注释:

/*
	/*int c= 10;*/
	int x = 5;
*/

2.1.3 Java中的标识符

1.在编程过程中,经常需要在程序中定义一些符号来标记一些名称,如包名、类名、方法名、参数名等,这些符号被称为标识符

①标识符可以由:大小写字母、数字、下划线(_)、美元符号($)组成。

---不能以数字打头、不能是Java中的关键字。

2.在编程中,有一些关于定义标识符的规约:

①包名所有字母一律小写,例如cn.itcast.test。

②类名和接口名的每个单词的首字母大写,如ArrayList、Iterator。


③常量名的所有字母都大写,单词之间用下划线连接,如DAY_OF_MONTH。

④变量名和方法名的第一个单词首字母小写,从第二个单词开始首字母大写,如lineNumber、getLineNumber。(小驼峰命名法)

⑤在程序中,应该尽量使用有意义的英文单词来定义标识符,使得程序便于阅读,如使用userName表示用户名,passWord表示密码。

2.1.4 Java中的关键字

关键字是编程语言里面事先定义好并赋予了特殊含义的单词,也被称为保留字。

所有的关键字都是小写的。

程序中的标识符不能以关键字命名。

2.1.5 Java中的常量

常量:程序中固定不变的数据。

1.整型常量:

整型常量是整数类型的数据,有二进制、八进制、十进制、十六进制,四种表示形式。

【在程序中为了标明不同的进制,data都有特定的标识:

八进制必须以0开头

十六进制必须以0x或0X开头;】

2.浮点数常量:

即小数,分为单精度浮点数(float)、双精度浮点数(double),两种类型。

单精度浮点数以F或f结尾

双精度浮点数以D或d结尾当在使用浮点数时,结尾不加任何后缀,虚拟机会某人其为双精度浮点数。】

①浮点数常量也可以通过指数形式表示。

3.字符常量

1.用于表示一个字符,一个字符常量要用一对英文半角格式的单引号''引起来

①它可以是:英文字母、数字、标点符号、转义序列表示的特殊字符(如'\u0000'表示一个空白字符)。

4.字符串常量:

1.用于表示一串连续的字符。

一个字符串常量要用一对英文半角格式的双引号""引起来

一个字符串可以包含一个字符或多个字符,也可以不包含任何字符,即长度为零

5.布尔常量

1.即布尔型的两个值:true、false。

②该常量用于表示一个事物的真与假。

6.null常量

只要一个值null,表示对象的引用为空。

【反斜杠(\):

1.在字符常量中,反斜杠(\)是一个特殊的字符,被称为转义字符。

它的作用是用来转义后面的一个字符

---转义后的字符通常用于表示一个不可见的字符或具有特殊含义的字符,如换行(\n)。】

2.2 Java中的变量

2.2.1 变量的定义

1.变量:程序运行期间,随时可能产生临时数据,程序会将这些data保存在一些内存单元中,这些内存单元就被称为变量。

①变量名:每个内存单元都有一个标识符来标识,这些标识符就是变量名。

①变量的值:存储在内存单元中的数据就是变量的值。

int x = 0, y;
y = x + 3;

上面的code中,第一行“定义了两个变量x、y,即分配了两个内存单元,同时为变量x分配了一个初始值0,变量y没有分配初始值。”

第二章  Java编程基础_个人学习笔记

第二行代码的作用是“为变量赋值,程序首先取出变量x的值,与3相加之后,将结果赋值给变量y”。

第二章  Java编程基础_个人学习笔记_02

2.2.2 变量的数据类型

1.Java是一门强类型的编程语言,对变量的data type有严格的规定。

定义变量的时候,必须声明变量的type,并且变量赋值的时候必须赋给变量同一类型的值,否则程序会报错

2.Java中变量的数据类型分为两种:基本苏剧类型、引用数据类型。

第二章  Java编程基础_心得_03

上述基本数据类型(8种)是Java语言内嵌的,在任何操作系统中都有相同大小和属性。

引用数据剋行是在Java程序中由developer自己定义的变量类型。

①整数类型变量


---用来存储整数数值。

---为了给不同大小的整数合理分配存储空间,其又细分为4种不同的类型:字节型(byte)、短整型(short)、整型、长整型(long)。

类型名

占用空间

取值范围

byte

8位(1个字节)

-2^7 ~ 2^7 - 1

short

16位(2个字节)

-2^15 ~ 2^15 - 1

int

32位(4个字节)

-2^31 ~ 2^31 - 1

long

64位(8个字节)

-2^63 ~ 2^63 - 1

在为一个long类型的变量赋值的时候需要注意,所赋值的后面要加上一个字母L(或小写l),说明赋值为long类型,如果赋的值未超过int型的取值范围,则可以省略字母L(或l)。

long num = 2200000000L;  //所赋的值超出了int型的取值范围,后面必须加上字母L
long num = 189L;  //所赋的值未超出int型的取值范围,后面可以加上字母L
long num = 198;  //所赋的值未超出int型的取值范围,后面可以省略字母L

②浮点数类型变量


---用来存储小数数值。

---Java中,浮点数类型分为两种:单精度浮点数(float)、双精度浮点数(double)。double比float表示的小数更加精确。

类型名

占用空间

取值范围

float

32位(4个字节)

1.4E-45 ~ 3.4E+38,

-1.4E-45 ~ -3.4E+38

double

64位(8个字节)

4.9E-324 ~ 1.7E+308,

-4.9E-324 ~ -1.7E+308

【上表中,E表示以10为底的指数,E后面的+号和-号代表正指数和负指数。如1.4E-45表示1.4 * 10^-45】

Java中,一个小数会被默认为double类型的value,因此在为一个float类型的变量赋值的时候,需要注意一点,所赋值的后面一定要加上字母F(或小写f),而为double类型的变量赋值的时候,可以在所赋值的后面加上字符D(或小写d),当然可以不加,反正会被默认为double类型。

在程序中也可以为一个浮点数类型变量赋予一个整数数值,如下:

float f = 100;			//声明一个float类型的变量并赋整数值
double d = 100;			//声明一个double类型的变量并赋整数值

③字符类型变量

1.用于存储一个单一字符,在Java中用char表示。

①Java中每个char类型的字符变量都会占用2个字节。

在给char类型的变量赋值的时候,需要用一对英文半角格式的单引号''把字符括起来,如'a'。也可以将char类型的变量赋值为0~65535范围内的整数,计算机会自动将这些整数转换为对应的字符,如数值97对应的字符为'a'

下面的两行code可以实现相同的效果:

char c = 'a'		//为一个char类型的变量赋值字符'a'
char ch = 97;   //为一个char类型的变量赋值整数97,相当于赋值字符'a'

④布尔类型变量

1.用来存储布尔值,在Java中用boolean表示,该类型的变量只有两个值,即true、false。

示例:

boolean flag = false;		//声明一个boolean类型的变量,初始值为false
flag = true;            //改变flag变量的值为true


2.2.3 变量的类型转换

在程序中,当把一种数据类型的值赋给另一种数据类型的变量时,需要进行数据类型转换。根据转换方式的不同,数据类型的转换分为两种:自动类型转换、强制类型转换。

1.自动类型转换

亦称”隐式类型转换“,指的是两种类型在转换的过程中不需要显式地进行声明。

要实现自动类型转换,必须同时满足满足两个条件:

①两种数据类型彼此兼容:

②目标类型的取值范围大于源类型的取值范围。


如:

byte b = 3;
int x = b;				//程序把byte类型的变量b转换成了int类型,无须特殊声明


整数类型之间可以实现转换:

①byte类型的数据可以赋值给short、int、long类型的变量;

②short、char类型的数据可以赋值给int、long类型的变量;

③int类型的数据可以赋值给long类型的变量;


整数类型可以转换为float类型:

①byte、char、short、int类型的数据可以赋值给float类型的变量;


其他类型可以转换为double类型:

①byte、char、short、int、long、float类型的数据可以赋值给double类型的变量。】

2.强制类型转换

亦称“显式类型转换”,指的是两种类型之间的转换需要进行显式地声明。

当两者类型彼此不兼容,或者目标类型取值范围小于源类型的时候,就需要进行强制类型转换

语法如下:

目标类型 变量 = (目标类型) 值

举例:

int num = 4;
byte b = (byte) num;

【表达式类型自动提升:

1.所谓表达式类型自动提示,是指由变量和运算符组成的一个算式。变量在表达式中进行运算时,也有可能发生自动类型转换,这就是表达式数据类型的自动提升,如一个byte类型的变量在运算期间类型会自动提升为int型。

byte b1 = 3;
byte b2 = 4;
byte b3 = b1 + b2;

---会报错,因为在表达式b1 + b2期间,变量b1和b2东北自动提升为int类型,表达式的运算结果也就成了int类型,这时如果将该结果赋给byte类型的变量就会报错,需要进行强制类型转换。

byte b3 = (byte) (b1 + b2);

---这些就不会再报错。

2.2.4 变量的作用域

1.在Java中,变量需要先定义后使用,但是这并不是指在变量定义之后的statement中一定可以使用该变量。

变量的作用域:变量可以作用的范围。

②在程序中,变量一定会被定义在某一对大括号中,该大括号所包含的code区域便是这个变量的作用域。

2.3 Java中的运算符

运算符用于对数据进行算术运算、赋值、比较等操作。

2.3.1 算术运算符

运算符

运算

例子

结果

+

正号

+3

3

-

负号

b = 4;

-b;

-4

+

5 + 5

10

-

6 - 4

2

*

3 * 4

12

/

5 / 5

1

%

取模(即求余数)

7 % 5

2

++

自增(前)

a = 2;

b = ++a;

a = 3;

b = 3;

++

自增(后)

a = 2;

b = a++;

a = 3;

b = 2;

--

自减(前)

a = 2;

b = --a;

a = 1;

b = 1;

--

自减(后)

a = 2;

b = a--

a = 1;

b = 2;

在进行取模(%)运算的时候,运算结果的正负取决于被模数(%左边的数)的符号,与模数(%右边的数)的符号无关。如(-5) % 3 = -2,而5 % (-3) = 2。】

2.3.2 赋值运算符


作用:将常量、变量、表达式的值赋给某一个变量。

运算符

运算

范例

结果

=

赋值

a=3;

b=2;

a=3;

b=2;

+=

加等于

a=3;

b=2;

a+=b;

a=5;

b=2;

-=

减等于

a=3;

b=2;

a-=b;

a=1;

b=2;

*=

乘等于

a=3;

b=2;

a*=b;

a=6;

b=2;

/=

除等于

a=3;

b=2;

a/=b;

a=1;

b=2;

%=

模等于

a=3;

b=2;

a%=b;

a=1;

b=2;

正确示例:

int x, y, z;
x = y = z = 5;

错误示例:

int x = y =z = 5;

2.3.3比较运算符

作用:对两个数值或变量进行比较,其结果是一个布尔值,即true或false。

运算符

运算

范例

结果

==

相等于

4 == 3

false

!=

不等于

4 != 3

true

<

小于

4 < 3

false

>

大于

4 > 3

true

<=

小于等于

4 <= 3

flase

>=

大于等于

4 >= 3

true

2.3.4 逻辑运算符

作用:对布尔型的数据进行操作,其结果仍是一个布尔型。

运算符

运算

范例

结果



&



true & true

true

true & false

false

false & false

false

false & true

false


I


true |true

true

true | false

true

false | false

false

false | true

true


^


异或

true ^ true

false

true ^ false

true

false ^ false

false

false ^ true

true

!

!true

false

!false

true


&&


短路与

true && true

true

true && false

false

false && false

false

false && true

false


||


  短路或

true || true

true

true || false

true

false || false

false

false || true

true

1.短路与(&&):左边为false,右边的表达式直接略过,不进行计算;

2.短路或(||):左边为ture,右边的表达式直接略过,不进行计算;】

2.3.5 位运算符

位运算符是针对二进制数的每一位进行运算的符号,它是专门针对数字0和1进行操作的。

运算符

运算

范例

结果

&


按位与

0 & 0

0

0 & 1

0

1 & 1

1

1 & 0

0

|

按位或

0 | 0

0

0 | 1

1

1 | 1

1

1 | 0

1

~

取反

~0

1

~1

0

^

按位异或

0 ^ 0

0

0 ^ 1

1

1 ^ 1

0

1 ^ 0

1

<<

左移

00000010<<2

00001000

10010011<<2

01001100

>>

右移

01100010>>2

00011000

11100010>>2

11111000

>>>

无符号右移

01100010>>>2

00011000

11...11100010>>>2

0011...111000

2.3.6 运算符的优先级

1.优先级:运算符参与运算的先后顺序。

第二章  Java编程基础_个人学习笔记_04

2.4 选择结构语句

2.4.1 if条件语句

if条件语句分为如下三种语法格式,每一种格式都有其自身的特点。

1.if语句

第二章  Java编程基础_Java_05

public class Example{
  public static void main(String[] args){
  	int x = 5;
    if(x < 10){
    	x++;	
    }
		System.out.println("x="+x);
  }
}

2.if...else语句

第二章  Java编程基础_心得_06

public class Example{

  public static void main(String[] args){

  	int num = 19;

    if(num % 2 == 0){
				//判断条件成立,num被2整除
    	 	System.out.println("num是一个偶数");
    }else{
    	  System.out.println("num是一个奇数");
    }

  }

}

【三元运算符:

判断条件 ? 表达式1 : 表达式2

2.if...else if ...else语句

作用:对多个条件进行判断,进行多种不同的处理。

2.4.2 switch条件语句

2.5循环结构语句

2.5.1 while循环语句

while(循环条件){
  执行语句
  ...
}

2.5.2 do...while循环语句

do{
  执行语句
  ...
	
}while(循环条件);

2.5.3 for循环语句

for(初始化表达式; 循环条件; 操作表达式){
  执行语句
  ...
}

2.5.4 跳转语句(break、continue)

1.break语句

switch条件语句、循环语句中都可以使用break语句。

①switch:终止某个case并跳出switch结构;

②循环语句:跳出循环语句,执行后面的code。

2.continue语句

循环语句可以使用contibue语句。

①循环语句:终止本次循环,执行下一次循环

2.6方法

2.6.1 什么是方法

1.举例:有一个程序,程序在运行的时候,会不间断发射炮弹(发射一次炮弹需要100行code,每次发射炮弹所需code相同),现在有两种方法,一是每次发射炮弹都在该位置添加这100行相同的代码。

二是把这100行code放在一个{}里面,为这个{}起个代号。每次需要发射炮弹就直接引用这个代号就好了。

【上面这个{}以及里面的code就是一个方法(当然还包括其修饰符,返回值类型、方法名,见下面2)。】

2.Java里面,声明一个方法的具体grammar格式如下:

下面的整体,叫做一个方法。

修饰符 返回值类型 方法名([参数类型 参数名1, 参数类型 参数名2, ...]){
	执行语句
  ...
	return 返回值;
}

①修饰符:方法的修饰符很多,如static(静态修饰符)、final(最终修饰符)等等。

②返回值类型:用于限定调用方法返回值的类型;

③参数类型:用于调用方法的时候传入参数的数据类型;

④参数名:一个变量,用于接收调用方式时传入的数据;

⑤return关键字:用于结束方法以及返回方法指定类型的值;

⑥返回值:被return语句返回的值,该值会返回给调用者。

2.6.2 方法的重载

Java中是要求先定义后使用,但是,这时对变量说的。方法在同一个类里面,定义顺序则没有关系,编译器会提前识别,且出于习惯,大多会将main放在最前面,其他方法放在最后面

①Java中,只有用class关键字定义的,才叫类。

---一个类里面可以有很多方法,如main、add01、add02等等。

public class Example22 {
    public static void main(String[] args) {

        int sum1 = add01(1, 2);
        // 下面是针对求和方法的调用
        int sum2 = add02(1, 2, 3);
        double sum3 = add03(1.2, 2.3);

        // 下面的代码是打印求和的结果
        System.out.println("sum1=" + sum1);
        System.out.println("sum2=" + sum2);
        System.out.println("sum3=" + sum3);
    }

    // 下面的方法实现了两个整数相加
    public static int add01(int x, int y) {
        return x + y;
    }

    // 下面的方法实现了三个整数相加
    public static int add02(int x, int y, int z) {
        return x + z + y;
    }

    // 下面的方法实现了两个小数相加
    public static double add03(double x, double y) {
        return x + y;
    }
}

方法的重载:Java中允许在一个程序中定义多个名称相同的方法,但是参数的类型或个数必须不同,这就是方法的重载

2.6.3 方法的递归

1.含义:在一个方法的内部调用自身的过程。

①递归需要满足:有结束条件。否则就会陷入无限递归的状态,永远无法结束调用。

2.7 数组

2.7.1 数组的定义

1.在Java中,可以使用以下格式来定义一个array:

int[] x = new int[100];

①上述statement相当于在内存中定义了100个int类型的变量。

为了更好地理解array的这种定义方式,可以将上面的一句代码分为两句来写,具体如下:

int[] x;								//声明一个int[]类型的变量
x = new int[100];				//创建一个长度为100的数组

②下面两张内存图详细说明了数组在创建过程中内存的分配情况:

第二章  Java编程基础_个人学习笔记_07

---第一行代码int[] x;声明了一个变量x,该变量的类型为int[],即一个int类型的数组。变量x会占用一块内存单元,它没有被分配初始值。

---第二行代码x = new int[100];创建了一个数组,将array的地址赋值给变量X。

2.数组静态初始化的两种方式:

// 静态初始化
int[] x = {1, 2, 3, 4};

// 或者
int[] x = new int[]{1, 2, 3, 4};


int[] x = new int[4]{1, 2, 3, 4}; // 会报错
//换句话说,要么告诉编译器“我给你一个长度,帮我分配默认值”,
//要么“我给你一组值,编译器自己推算长度”。

2.7.2 数组的常见操作

1.数组遍历

遍历的定义:依次访问数组中的每个元素。

public class Example30 {
    public static void main (String[] args) {
        int[] arr = {1, 2, 3, 4, 5}; // 定义数组
        // 使用 for 循环遍历数组的元素
        for (int i = 0; i < arr.length; i++) {
            System.out.println(arr[i]); // 通过索引访问元素
        }
    }
}

2.数组最值

public class Example31 {
    public static void main(String[] args) {
        // 定义一个数组
        int[] arr = {4, 1, 6, 3, 9, 8};

        // 调用获取最大值的方法
        int max = getMax(arr);

        // 打印最大值
        System.out.println("max = " + max);
    }

    // 获取数组中最大值的方法
    static int getMax(int[] arr) {
        int max = arr[0]; // 假设第一个元素为最大值
        // 遍历数组
        for (int x = 1; x < arr.length; x++) {
            if (arr[x] > max) {
                max = arr[x]; // 更新最大值
            }
        }
        return max; // 返回最大值
    }
}

3.数组排序

以冒泡排序为例子。

public class Example32 {
    public static void main(String[] args) {
        int[] arr = {9, 8, 3, 5, 2};

        System.out.print("冒泡排序前: ");
        printArray(arr); // 打印数组元素

        bubbleSort(arr); // 调用排序方法

        System.out.print("冒泡排序后: ");
        printArray(arr); // 打印数组元素
    }

    // 定义打印数组方法
    public static void printArray(int[] arr) {
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i] + " ");
        }
        System.out.print("\n");
    }

    // 定义对数组排序的方法
    public static void bubbleSort(int[] arr) {
        // 外层循环控制趟数
        for (int i = 0; i < arr.length - 1; i++) {
            // 内层循环控制比较次数
            for (int j = 0; j < arr.length - i - 1; j++) {
                if (arr[j] > arr[j + 1]) {
                    // 交换 arr[j] 和 arr[j+1]
                    int temp = arr[j];
                    arr[j] = arr[j + 1];
                    arr[j + 1] = temp;
                }
            }
            System.out.print("第" + (i + 1) + "轮排序后: ");
            printArray(arr);
        }
    }
}

2.7.3 多维数组

1.定义多维数组的三种方式:

int[][] arr = new int[3][4];

---定义了一个 3 行 4 列 的二维数组,所有元素默认值是 0

int[][] arr = new int[3][];

---定义了一个 “不规则二维数组”,只有外层长度 = 3。

第二章  Java编程基础_Java_08


int[][] arr = {
    {1, 2},
    {3, 4, 5, 6},
    {7, 8, 9}
};

第二章  Java编程基础_Java_09

2.8 本章小结

Java语言的基础grammar、常量、变量、运算符--->条件选择语句、循环语句--->方法、数组。

2.9 习题

1.Java中的程序code都必须放在一个类中定义,类使用class关键字来定义。

2.布尔常量即布尔类型的类型的两个值,分别为truefalse

3.Java中的注释可以分为三种,分别是单行注释多行注释文档注释

4.Java中的变量可以分为两种数据类型,分别是基本数据类型引用数据类型

5.Java语言严格区分大小写。

6.以下选项中,哪些属于合法的标识符?(多选)(AD)

A. Hello_World

B. class

C. 123username

D. username123

📌 Java 标识符规则

  1. 可以包含:字母、数字、下划线 _、美元符号 $
  2. 不能以数字开头
  3. 不能使用关键字(如 classpublic 等)。
  4. 严格区分大小写。