• 注释

注释不会直接影响到程序语义,只是作为注解存在

Java有三种注释方式:单行注释、多行注释和文档注释

  1. 单行注释:以双斜杠(//)开始,直到行尾。通常用于对单行代码进行简短说明

  2. 多行注释:以/开始,以/结束,可以跨越多行。通常用于对一段代码进行详细说明

  3. 文档注释:以/**开始,以*/结束,可以跨越多行。文档注释可以被JDK提供的javadoc工具解析,生成HTML格式的文档。文档注释通常包含一些标签,如@author, @version, @param, @return, @throws等,用于描述类、方法、参数和返回值等(后续再介绍,现只需了解)

  • 关键字

关键字也称为保留字,每个关键字在Java语言中具有各自特定的意义

Java语言所提供的关键字一共有48个(如图),每个关键字形式上都是小写

  • 标识符

标识符由程序员设定,用来作为程序中变量、数组、方法、类等程序元素的名字

标识符定义时必须符合一定的规则:

  1. 标识符可以由英文字母(A~Z,a~z)、数字、汉字、$、下划线_等字符组成,除此以外的其他字符不能出现在用户标识中
  2. 标识符的首字符不可以是数字字符
  3. 标识符不能与关键字同名
  4. 标识符是区分大小写的

此外,用户标识符要尽可能见名知意,也就是通过变量名就知道变量值的含义。

Java中,除了包名、静态常量等特殊情况,大部分情况下标识符可使用驼峰法则,即单词之间不用特殊符号分割,而是通过首字母大写来分割。

比如:SupplierName而不是supplier_name

  • 常量

常量有一个具体而明确的值,在程序执行过程中,不可能发生变化

整型常量

整型常量有四种形式,分别是:十进制、八进制、十六进制,以及二进制

浮点型常量

 浮点型常量有两种形式,一种是十进制小数形式,另一种是指数形式

字符型常量 

字符型常量是由单引号括起的单个字符,字符型常量区分大小写字母

有些字符,如换行、退格等,它们无字形表示,需要采用特殊的形式——转义字符来表示(如图)

布尔型常量

布尔型常量只有两个值:true和false

  • 变量

变量在程序中用于存放数据。每个变量需要有一个名字,属于一个确定的数据类型,再占据一定存储空间用来存放数据,这个数据也就是变量的值。在程序运行过程中,变量的值是可以改变

变量的声明

数据类型 变量名(如图)

变量的初始化

给变量设置一个初始值(如图)

  • 数据类型

  • 基本数据类型

Java语言有8种基本数据类型。常常被划分为整型、浮点型、字符型、布尔型四大类。

整型

byte(单字节,字节整型)

short(2字节,短整型)

int(4字节,普通整型)

long(8字节,长整型)

浮点型

float(4字节,单精度浮点型)

double(8字节,双精度浮点型)

字符型

char(字符型)

布尔型

boolean(布尔型)

  • 引用数据类型

除了基本数据类型以外所有都是引用数据类型

如:String,数组等

  • 基本输入与输出语句

基本输出语句

如果需要将常量、变量或表达式的值显示输出,

可以利用System.out.print()方法与System.out.println()方法。

这两个方法的功能基本相同。两者的区别是在输出指定内容之后,

前者将光标停留在输出内容的后面,而后者将光标移到下一行开始位置

System.out.print()方法与System.out.println()方法都只能输出一项内容,如果希望输出多项内容,则需要用拼接运算符(+)将多项内容拼接成一项

以上两种方法可以实现数据输出,但控制输出格式是一个比较棘手的问题,为此提供了更加方便的System.out.printf()该方法既可以控制数据输出的格式,又可以方便地输出多项


System.out.printf("格式控制字符串",表达式1,表达式2...)

格式控制字符串可以包含格式控制字符和普通字符,

普通字符按原样输出,而格式控制符用于指定对应表达式的格式(如图)

格式控制字符串不但可以灵活指定各种数据类型的输出格式,而且可以与各种标志搭配组合在一起,形成更丰富的输出格式,搭配格式控制符的标志(如图)

基本输入语句

Java语言增加了Scanner类,为数据输入带来了很大的方便

Scanner类的主要方法(如图)


为了实现数据输入,程序中首先需要使用import语句通知编译器,程序中将使用java.util包中的Scanner类,然后创建一个Scanner对象,接下来就可以调用kb.nextDouble()方法,读取键盘输入的一个双精度浮点数(先尝试使用,具体后续介绍)

  • 运算符&表达式

算术运算符&算术表达式

Java语言提供9种算术运算符(如图)一般分为双目运算符和单目运算符两大类

双目运算符有两个数据参与运算,单目运算的对象则只有一个数据

双目运算符包括:+(加)、-(减)、*(乘)、/(除)、%(取余)


使用算术运算符时需要注意以下问题

1.如果除法运算的除数和被除数都是整数,则按整除的规则进行;

如果有一个数据为浮点数,则浮点数除法的规则进行

如:表达式189/10的值为18,而189.0/10的值为18.9

2.参与取余运算(%)的数据一般是两个整型数据。

如果a和b是两个整数变量,则表达式a%b运算的方式是将a作为被除数,b作为除数,进行整除运算,运算结果不是商,而是余数

应用:若k为整数,k%10可以计算k的个数,k%2是否为0可以用于判定表明k是否为偶数


单目运算符包括:+(加)、-(减)、++(自增)、--(自减)

自增运算符将变量的值加1后再存入这个变量;

自减运算符将变量的值减1后再存入这个变量

自增和自减运算符可以再变量左侧,也可以在变量右侧

如:++a,a++ 如果仅作为独立的语句,两者执行结果并没有区别

但如果自增和自减运算符与其他运算符组合使用,运算符放在左侧与放在右侧,执行结果会明显不同。

注意:自增运算符和自减运算符的运算对象都只能是变量,不能是常量或其他表达式,

如:6++或(a+b)++的表达式是非法的

关系运算符&关系表达式

在许多情况下,程序中要对某些条件做出判断,根据条件成立与否,决定程序的执行流程

Java提供了六种关系运算符(如图)

注意:

1.不要将关系运算符“==”误写成“=”

在Java语言中“=”是赋值运算符,判断相等关系的运算符是“==”

2.数学表达式“3<x<5”,

在Java语言中,不能直接描述为“3<x<5”,而需要借助逻辑表达式“x>3&&x<5”

逻辑运算符&逻辑表达式

逻辑运算的运算对象是布尔型数据,运算结果也是逻辑型数据

常用的逻辑运算符有:

&&(逻辑与)

||   (逻辑或)

! (逻辑非)

运算规则(如图)

1.当两个运算对象都为true时,逻辑与(&&)的运算结果为true,否则运算结果为false

2.当两个运算对象都为false时,逻辑或(||)的运算结果为false,否则运算结果为true

3.逻辑非(!)时单目运算符,只有一个运算对象。运算对象为true,运算结果为false;

运算对象为false,运算结果为true

在Java语言中,&&和||的运算会遵循“短路”规则,逻辑表达式中的部分运算在某些情况下,并不被执行

短路规则一定程度上可以提高程序执行的效率

赋值运算符&赋值表达式

赋值运算符(“=”)用于为变量指定数值

基本形式: 变量 = 表达式

赋值运算符的左边只能是一个变量,右边则是一个表达式。

右边的表达式,可以是个简单的常量或变量,也可以由变量、常量、运算符构成的更加复杂的运算式子

赋值表达式的处理过程是:首先计算赋值运算符右边表达式的值,而后将该值赋值予左边的变量

该值既成为左边变量的值,也作为赋值表达式的值

一般来说左边的变量和右边的表达式应具有相同的数据类型,如果不同,则要通过数据类型转换

(相关规则后续介绍)

条件运算符&条件表达式(三元运算符)

条件运算符将3个表达式组合在一起,组成条件表达式

条件表达式的一般形式是:表达式1?表达式2:表达式3

条件表达式的运算过程是:先计算表达式1的值,如果它的值为true,将表达式2的值作为条件表达式的值,否则,将表达式3的值作为条件表达式的值

其他运算符&其他表达式

1.位运算符

位运算符适合用于整型的运算对象,运算特点是以二进制为单位进行。运算规则(如图)


2.复合赋值运算符

复合赋值运算符是一种基本运算与赋值运算合并的简化书写形式

x+=y 应对于x=x+5

x*=y+5 应对于x=x*(y+5)

a%=2 应对于a=a%2

表达式的处理规则

1.运算符优先级

优先级规定同一表达式中不同运算符被执行的次序

常见的运算符中,运算优先级由高到低分别是:

单目运算、算术运算、关系运算、逻辑运算、赋值运算

(如图)给出了所有运算符的优先级


2.运算符结合性

运算符的结合性规定了优先级相同情况下的计算顺序

+、-、*、/等大多数运算符的结合性是左结合,即先左后右,

对于表达式x-y+z,y应先与“-”号结合,执行x-y运算,然后再执行+z的运算

右结合性运算符包括单目运算符、赋值运算符以及条件运算符

比如:赋值表达式“x=y=z”执行的次序是:先执行y=z再执行x=(y=z)运算


3.数据类型转换

如果参与运算的对象具有相同的数据类型,那么可以直接进行运算;

否则需要进行类型转换。有些转换可以自动完成,有些转换必须采用强制方法

强制转换可能造成运算精度降低

(如图)如果转换是沿箭头方向进行的,就不会造成运算精度降低,可以自动完成;否则必须采用强制转换的方法

  • 流程控制

顺序结构

程序默认的执行流程,按照代码的先后顺序,依次执行

中间没有任何判断和跳转

分支结构

根据条件判断,选择不同的代码执行


if语句

一般格式:

if (条件表达式)

   语句A


if-else语句

一般格式:

if (条件表达式)

   语句A;

else

   语句B;


嵌套if语句

if语句所包含的语句A(或语句B)也可以是一个if语句,也就是说if语句内嵌了另一个if语句,一般称之为嵌套if语句

switch语句

多层的if嵌套可以实现多分支的选择结构,但过多的if嵌套会使得程序不太容易理解。Java语言提供了switch语句,用于处理多分支问题

一般格式:

switch(表达式A){

       case  常量表达式1:

                 语句序列1;

                 break;

       case  常量表达式2:

                 语句序列2;

                 break;

       case  常量表达式3:

                 语句序列3;

                 break;

...

       case  常量表达式n:

                 语句序列n;

                 break;

       default:

                语句序列n+1;

}


每个case以及default表示一个分支,语句执行时会根据表达式A的值,选择执行对应的分支

switch语句的执行流程是:

首先计算表达式A的值,然后用此值依次与各个case的常量表达式比较,当表达式A的值与某个case后面的常量表达式的值相等时,就转去执行此case后面的语句序列,执行break语句后就会退出switch语句

若表达式A的值与所有case后面的常量表达式都不等,则执行default后面的语句n+1,然后退出是switch语句

注意:

1.表达式A的数据类型可以是byte、short、int或char,而不可以是long、float、double和boolean

2.每个case后面都是常量表达式,其中不可以出现变量。每个case的常量表达式的值必须互不相同,否则就会出现互相矛盾的现象

3.从形式上来说,break语句并不是必需的。但去掉break语句后,程序流程会发生变化

比如:如果把语句序列2后面的break语句删除,那么当表达式A的值与常量表达式2的值相等,不仅会执行语句序列2,还会执行其后的语句,一直执行至遇到break语句或者是switch语句结束

循环结构

for循环

一般格式:

for(表达式;表达式2;表达式3)

        循环体


表达式1通常是初始化语句,在循环开始以前执行依次,用于变量初始化;

表达式2必须为布尔类型,是循环体执行的条件;

表达式3用于再循环体执行后,修改循环条件相关变量的值

for语句的执行流程(如图)

while循环

一般格式:

while(条件表达式)

            循环体


循环体可以是单个语句,也可以包含多条语句

如果循环体包含多条语句,必须写成快语句的形式,也就是写在一对花括号内({})

(如图),while语句的特点是:先判断条件,后执行循环体

用while循环编写程序需要明确两个问题:

其一是怎么样的操作需要循环体执行的;

其二是循环什么时候停下来

do-while循环

一般格式:

do

      循环体

while(条件表达式);


do-while语句执行流程(如图),首先执行循环体语句,然后检查循环条件

如果布尔表达式为true就继续循环,否则循环结束

可以看出,do-while语句和while语句的区别在于:

while语句是先判断后执行,而

do-while语句是先执行后判断;

while语句循环体可能一次都不执行,而

do-while语句无论条件真假,循环体至少执行一次

控制跳转语句

break(不带标签)

作用范围:break语句只能用在循环switch

在switch结构中,break语句用于退出switch语句。如果switch中没有break,会发生“case穿透”

break语句也可以用在循环结构中,与if语句配合,实现在一定条件下终止循环

continue(不带标签)

作用范围:continue语句只能用在循环结构中。

如果在循环体中执行了continue语句,则跳过本轮循环的剩余语句,转而进行下一轮循环条件的判定,并根据判定再一次执行循环体,或终止循环。

continue语句只结束本轮循环,而不终止整个循环的执行。而break语句则是结束在整个循环过程

return

作用范围:整个方法

return用于结束方法执行并返回值

void方法:使用return;提前结束方法

非void方法:必须使用return value;返回相应类型的值

标签(Label)

标签(Lable)是一个标识符,用于标识循环或代码块的位置

通常与break和continue语句一起使用,以便从多层嵌套循环中跳出或继续


break(带标签)

带标号的break的基本格式:

  break  标号名


在循环嵌套结构中,

不带标号的break语句仅可以终止它所在的最内层的循环,

带标号的break语句则可以跳出标号所指定的循环,

如果标号指向外层循环,那么break跳出外层循环;

如果标号指向内层循环,那么break跳出内层循环


continue(带标签)

带标号的continue的基本格式:

  continue  标号名


当在循环结构中执行带标号的continue语句时,将直接执行标号所指向的循环结构的下一次循环

带标号的continue语句一般用于嵌套的循环结构中


  • 数组

一维数组

1.一维数组的声明

一维数组必须先声明后使用。声明数组时,需要指明数组名称、数组元素的数据类型

一维数组声明语法格式有下面两种

方式一:

数组元素类型[] 数组名;

方式二:

数组元素类型 数组名[]

2.一维数组的创建

声明数组仅仅给出了数组的名称和其中可存放数据的类型,而真正使用数组来保存数据,必须为该数组分配内存空间,即创建数组

在创建数组的长度,即数组中可存放的数据个数

Java语言中创建数组的语法格式为:

数组名 = new 数组元素类型[数组长度]

数组创建之后,系统为每个数组元素分配一个初始值,如int型为0,float或double为0.0,char型为’\0‘,double型为false

注意:数组一旦被创建,其大小就无法改变

3.一维数组的初始化

在定义数组的同时,可以对数组进行初始化,也就是为数组元素设置指定的初始值

注意:不要再数组声明中指定数组的大小,否则会引起错误

4.一维数组元素的访问

数组的访问以元素为单位,而不能直接访问数组整体

数组元素可通过下标访问,形式为:数组名[下标](如图)

下标可以是整型表达式。Java中数组元素的下标从0开始,因此若数组长度为n则下标从0开始,最大值为n-1

程序中可以使用如下形式的表达式来获取数组的长度值,也就是数组的元素个数

数组名.length

(如图),则a.length、b.length的值分别为20和10

多维数组

二维数组

二维数组类似一个二维矩阵

通过行下标和列下标来标识二维数组中的某一个元素,

其中数组行下标和列下标均从0开始


1.二维数组的声明

同一维数组类似,二维数组的声明方式也有以下两种:

方式一:数组类型[][] 数组名称;

例如:double[][] b;

方式二:数组类型 数组名称[][];

例如:double b[][];

2.二维数组的创建

同一维数组类似,通过new运算符进行二维数组的创建

创建每一行的列数都相同的二维数组的语法如下:

数组名称 = new 数组类型[数组行数][数组列数];

3.二维数组初始化

同一维数组一样,二维数组创建之后,系统为每个数组元素分配一个默认的值,

如int型数据的值为0,而double型数据的值为0.0

在声明数组的同时,也可以给数组中的元素赋值(如图)

注意:在声明二维数组的同时给数组中的元素赋值时,必须用大括号{}将数组中的行元素括起来,不同行元素之间用逗号分割开来

对每一行的元素个数不一样的二维数组,可以有如下方式初始化(如图)

则数组score第一行有1个元素,第二行有2个元素,第三行有3个元素

4.二维数组元素的引用

可以通过行下标和列下标引用二维数组中某一个数组元素,其中数组行下标和列下标也均从0开始

因此,对一个2行3列数组,则其行下标为0和1,列下标为0,1,2

否则,程序将发生数组下标越界异常

和一维数组不同的是,二维数组的length属性指明了数组的行数

数组名称.length可以得到数组的行数,通过数组名称[i].length可以的得到数组第i行的行数

  • 方法

是什么方法?

方法(method)是程序中的最小执行单位

方法有什么用?

类比:植物大战僵尸里的豌豆射手一次发射10颗子弹,需要写10行发射代码

第二次发射时如果按最基本的思路则需要再写10行发射代码

此时如果利用调用方法,则将10行发射代码用方法lauch命名

调用方法lauch,则可以大大提高代码运行效率,减少代码重复

方法的定义与调用

把代码打包在一起,该过程称作方法定义

方法定义后并不是直接运行的,需要手动调用才能执行,该过程称为方法调用


1.最简单的方法的定义和调用,格式:

public static void 方法名() {

          方法名 (就是打包起来的代码);

}

  方法的调用,格式:

          方法名 ();


2.带参数的方法的定义和调用

单个参数:方法名(参数);

多个参数:方法名(参数1,参数2,...

形参和实参

形参:全称形式参数,是指方法定义中的参数

实参:全称实际参数,方法调用中的参数

注意:方法调用时,形参和实参必须一一对应,否则程序报错


3.带返回值方法的定义与调用,格式: void改为返回值类型

public static 返回值类型 方法名(参数) {

          方法体 ;

         return 返回值;

}

方法的返回值其实就是方法运行的最终结果

有返回值的调用格式:

1.直接调用:

方法名(实参);

2.赋值调用(常用):

整数类型 变量名 =方法名(实参);

3.输出调用:

System.out.println(方法名 (实参));

方法的重载

在同一个类中,定义了多个同名的方法,这些同名的方法具有同种功能

每个方法具有不同的参数类型或参数个数,这些同名的方法,就构成了重载关系

也就是说:同一个类中,方法名相同,参数不同的方法。与返回值无关

参数不同:个数不同,类型不同,顺序不同

递归

一个方法不仅可以调用其他方法,也可以直接或间接调用自己,这种自己调用自己的方法称为方法的递归调用,带有递归调用的方法称为递归方法。

其中直接递归调用是指方法体内直接包含了对本方法的调用;

间接递归调用是指在方法体内间接包含了对本方法的调用,如A方法调用了B方法,而B方法又调用了A方法。

递归示例(如图)

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐