[Java] 基本语法
-
注释
注释不会直接影响到程序语义,只是作为注解存在
Java有三种注释方式:单行注释、多行注释和文档注释
-
单行注释:以双斜杠(//)开始,直到行尾。通常用于对单行代码进行简短说明

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

-
文档注释:以/**开始,以*/结束,可以跨越多行。文档注释可以被JDK提供的javadoc工具解析,生成HTML格式的文档。文档注释通常包含一些标签,如@author, @version, @param, @return, @throws等,用于描述类、方法、参数和返回值等(后续再介绍,现只需了解)
-
关键字
关键字也称为保留字,每个关键字在Java语言中具有各自特定的意义
Java语言所提供的关键字一共有48个(如图),每个关键字形式上都是小写

-
标识符
标识符由程序员设定,用来作为程序中变量、数组、方法、类等程序元素的名字
标识符定义时必须符合一定的规则:
- 标识符可以由英文字母(A~Z,a~z)、数字、汉字、$、下划线_等字符组成,除此以外的其他字符不能出现在用户标识中
- 标识符的首字符不可以是数字字符
- 标识符不能与关键字同名
- 标识符是区分大小写的
此外,用户标识符要尽可能见名知意,也就是通过变量名就知道变量值的含义。
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方法。
递归示例(如图)

更多推荐


所有评论(0)