第2章 基本语法

简介: 如何利用Java语言进行计算、并控制计算流程。

2.1 变量和数据类型

2.1.1 变量

  1. 概念:相当于内存中一个数据存储空间的表示。
  • 不同类型的变量,占用的内存空间大小不同。
  • 该存储空间的值,可以在同种类型范围内不断变化。
  1. 三个基本要素:类型、名称、值。
  • java中变量的声明和初始化可以是两条语句,但使用前必须必须赋值进行初始化。
  • int num; num = 10;
  1. 注意点:
  • 变量必须先声明,后使用。
  • 同一作用域内,变量不能重名。
  • int a = b = c;这种初始化方式会报错。
  • int a, b, c;这种初始化方式不会报错。
  1. 输出语句中+的含义:
  • 左右两边都是数值时,做加法运算。
  • 左右一边有字符串时,做拼接运算。

2.1.2 数据类型

  1. 基本数据类型
  • 整数型:
  • 整数型默认使用int大小的存储空间,使用long大小的存储空间时结尾加L。

类型

占用存储空间

表示范围

byte

1字节

-21*8-1~21*8-1-1

short

2字节

-22*8-1~22*8-1-1

int

4字节

-24*8-1~24*8-1-1

long

8字节

-28*8-1~28*8-1-1

  • 浮点类型:
  • 浮点类型都是近似值,因为存在小数位丢失的问题。
  • 内存中的存放形式:浮点数=符号位+指数位+尾数位。
  • 浮点型默认使用double大小的存储空间,使用float大小的存储空间时末尾加f或F。
  • 浮点型除以整形存在精度问题,在编程中,应当注意对运算结果是小数的运算、判断!应该以两个数差值的绝对值在某个精度范围内判断。

类型

占用存储空间

表示范围

float

4字节


double

8字节


  • 字符:
  • 字符型要用单引号,不能使用双引号。
  • 字符型也可以直接赋值(整数),不需要用单引号,输出时显示对应的Unicode编码。
  • 字符型本质上是一个整数,可以参与运算。
  • 字符型还可以赋值为转义字符,需要单引号。
  • 字符型也可以赋值为单个汉字,需要单引号。
  • 布尔类型:
  • Java对布尔类型的存储占用空间大小没有做规定,理论上只需要1bit(0或者1),但由于计算机中最小存储单元为字节(Byte),所以占用应为1字节,同时又因为编译后虚拟机(JVM)中布尔类型的值会被转换为int类型的数据代替,所以会占用4个字节。
  • Java中不可以用0或者非0的整数代替 false或true,即Java中布尔类型的值只能为true或false。
  1. 自动类型转换:
  • Java中程序在进行赋值或运算时,精度小的类型会自动转换为精度大的类型。
  • char→int→long→float→double
  • byte、short→int→long→float→double
  • 几点规律:
  • 多种类型的数据混合运算时,系统会将所有数据自动转换为容量最大的那种数据类型,然后再进行计算。
  • (byte、short)和char之间不会相互自动转换。
  • 无法进行容量大的类型向容量小的类型自动转换,会报错。
  • byte、short、char在进行运算时,会自动转换为int,所以需要存储空间大于等于int的类型。
  • int=byte+byte(对),short=byte+byte(错),其他同理。
  • 布尔类型不参与自动类型转换。
  1. 强制类型转换
  • 自动类型转换的逆过程。
  • 转换过程中会造成精度降低或溢出。
  • char类型可以保存int的常量值(自动类型转换,int自动转char),但不能保存int的变量值。【原因:类型转换问题】
  1. 基本数据类型和String类型的转换
  • 基本数据类型--->String类型:基本数据类型 + ""
  • String类型--->基本数据类型:
  • Byte.parseByte()
  • Short.parseShort()
  • Integer.parseInt()
  • Long.parseLong()
  • Float.parseFloat()
  • Double.parseDouble()
  • Boolean.parseBoolean()
  • char类型没有上述的方法,s.charAt(n)可以获取字符串s指定位置的字符。
  • 注意点:
  • String类型转换为基本类型时,必须先确保可以转换为对应的类型。如123hello不能转换为int
  • 如果格式不正确,会抛出异常,程序终止。
  1. 变量的赋值:
  • 如果变量是基本数据类型,此时赋值的是变量所保存的数据值。
  • 如果变量是引用数据类型,此时赋值的是变量所保存的数据的地址值。

2.2 运算符

2.2.1 算术运算符

  1. %本质是a % b = a - a / b *b,所以10 % -3 = 10 - 10 / (-3) * (-3) = 1
  2. ++的经典面试题:
  • i = i++:(1)temp=i,(2)i=i+1,(3)i=temp,结果为i
  • i = ++i:(1)i=i+1,(2)temp=i,(3)i=temp,结果为i+1
  1. 进行b++时不会进行强制类型转换,如:
  • byte b=127;b++不会报错,输出-128。
  1. 注意:前减减/前加加的优先级高于=,后加加/后减减的优先级低于=
  2. 整数运算在除数为0时会报错,而浮点数运算在除数为0时,不会报错,但会返回几个特殊值:
  • NaN表示Not a Number,0.0 / 0
  • Infinity表示无穷大,1.0 / 0
  • -Infinity表示负无穷大,-1.0 / 0

2.2.2 关系运算符

  1. 关系运算符的结果都是boolean类型,要么是true,要么是false。
  2. ==判断引用数据类型时,比较的是地址值。
  • 左右两侧数据类型要一致,否则编译报错。
  1. ==判断基本数据类型时,比较的是具体值。
  • 左右两侧不一定类型要相同,会进行自动数据类型提升
  • boolean除外,boolean与不是boolean的比较时会报错。
  1. 判断字符串时:
  • 字符串以字面量形式声明:比较内容
  • 字符串以new关键字声明:比较地址值
  • 规范情况:须使用isequals()方法

2.2.3 逻辑运算符

  1. 逻辑运算符的结果都是boolean类型,要么是true,要么是false。
  2. &&:第一个条件为false时,立即得出结果为false,效率高,而且后面部分不会被执行
  3. &:即使第一个条件为false,第二个条件的计算还会执行。
  1. ||:第一个条件为true时,立即得出结果为true,效率高,而且后面部分不会被执行
  2. |:即使第一个条件为true,第二个条件的计算还会执行。
  3. 开发中常用&&||

2.2.4 赋值运算符

  1. 赋值运算符左边只能是变量,右边可以是变量、表达式、常量值。
  2. 复合运算符会进行强制类型转换。

2.2.5 三元运算符

  1. 本质实际上是if-else语句。
  • 条件表达式1 ? 表达式1 : 表达式2
  • 表达式1和表达式2要求类型一致,所以会自动类型提升。

2.2.6 位运算符

  1. 原码、反码、补码:
  • 二进制数的最高位为符号位,0表示正数,1表示负数。
  • 正数的原码、反码、补码都一样。
  • 负数的反码 = 原码符号位不变,其他位的数取反。
  • 负数的补码 = 反码 + 1,负数的反码 = 补码 - 1。
  • 0的反码,补码都是0。
  • java没有无符号数  ,即java中的数都是有符号的。
  • 0在java中表示正数。
  • 计算机运算的时候,都是以补码进行运算。
  • 使用运算结果的时候,需要看它的原码。
  1. 算数右移>>:符号位不变,低位溢出,高位补0。
  • m >> n本质是m / 2^n
  • 注意:负数跨越0时输出均为-1。
  • 负数的算数右移?
  1. 算术左移<<:符号位不变,高位溢出,低位补0。
  • m << n本质是m * 2^n
  1. 逻辑右移或无符号右移>>>:低位溢出,高位补0(符号位也跟着移动)。
  2. 没有<<<

2.2.7 运算符优先级

  • ++优先级的问题:
  • 算术运算(赋值):
  • 逻辑运算:
  • 三元运算:

2.3 流程控制

2.3.1 顺序控制

  1. java程序默认的执行流程,从上到下逐行执行,所以 变量必须先声明后使用。

2.3.2 分支控制

  1. 单分支【if】:
  • 即使执行的代码块语句只有一条,也建议加上{}
  • 当只有一条语句时,可以不用{}直接换行写,也可以不用换行,与if写在同一行。
  1. 双分支【if……else】:
  2. 多分支【if……else if……else】:
  • 多分支可以没有最后的else。
  • 多分支只有一个执行入口,即从这个入口执行了语句,其余入口的语句不会被执行 。【先入为主】
  • 如下述的伪代码,最高分为80时,考了90分的只会从第一个入口进,输出A,而不会再去判断后面的B、C、D
if(成绩成绩>=最高分-10){
等级为A}elseif(成绩>=最高分-20){
等级为B}elseif(成绩>=最高分-30){
等级为C}else{
等级为D}
  1. 嵌套分支:
  • 一个分支结构中嵌套了另一个完整的分支结构。
if(){
if(){
elseif(){
xxx;
        }else{
xxx;
        }
    }else{
xxx;
    }
}
  • 为了保证可读性,不要超过三层。
  1. switch分支:
switch(表达式){
case常量1:
语句1;
break;
……case常量n:
语句n;
break; 
default:
default语句块;
break;}
  • 穿透:如果case语句没有break语句,程序会继续执行下一个case的语句,而不会进行case判断。
  • switch表达式的数据类型,应和case后面的常量类型一致,或者表达式的数据类型可以自动转换为常量类型。
  • switch表达式的返回值必须是byte、short、int、char、enum【枚举】、String。
  • case语句的值必须是常量或常量表达式,不能是变量或带变量的表达式。
  1. switch和if的选择:
  • 运算的结果数值不多,且是byte、short、int、char、enmu、String的某种类型,建议使用swtich。
  • 对于区间判断、结果为boolean的判断,建议使用if。

2.3.3 循环控制

  1. for循环:
  • 基本语法:
for(循环变量初始化;循环条件;循环变量迭代){
循环操作;
}
  • 四要素:循环变量初始化、循环条件、循环操作、循环变量迭代。
  • 循环初始值可以有多条初始化语句,但要求类型一样,并用逗号隔开int i = 0, j = 0
  • 循环变量迭代可以有多条变量迭代语句,中间用逗号隔开i++, j++
  • 如果循环操作只有一条语句,可以省略{},建议不要省略。
  • for(;循环条件;)
  • 循环变量初始化和循环变量迭代可以写到其他地方,但是;不能省略。
  • 循环变量初始化写到其他地方时,作用域再循环体外。否则只能作用域循环体内。
  • for(;;):表示无限循环。
  1. while循环:
  • 基本语法:
循环变量初始化;
while(循环条件){
循环体;
循环变量迭代;
}
  • 四要素:同for循环。
  1. do…while循环
  • 基本语法
循环变量初始化;
do{
循环体;
循环变量迭代;
}while(循环条件);
  • 四要素:同for循环。
  • 注意while后面的;
  1. 增强for循环
for(inti : nums) {
System.out.println("i="+i);
}
  • 依次从nums数组、枚举类等中取出数据,赋给i。

2.3.4 多重循环控制

  1. 建议循环嵌套不要超过2层,否则可读性非常差。
  2. 外层循环m次,内层循环n次,则内层循环体实际上需要执行m*n次。
  3. break:结束当前循环。
label1:
for(...){
label2: 
for(...){
label3:
for(...){
breaklabel1;
         }
    }
}
  • break配合label标签可以指定跳出哪层循环。
  • label是标签名,由程序员指定,实际开发中,尽量不要使用标签。
  • 如果break后没有指定的label标签名,则表示跳出最近的循环体.
  1. continue:结束当次循环
label1:
for(...){
label2: 
for(...){
label3:
for(...){
continuelabel1;
         }
    }
}
  • continue配合label标签可以指定跳出哪层循环。
  • label是标签名,由程序员指定,实际开发中,尽量不要使用标签。
  • 如果contineu后没有指定的label标签名,则表示跳出最近的循环体。
  • continue不能用于switch-case语句中
  1. return:
  • return用在方法内时,表示跳出方法,用在main方法中表示退出程序。本质上不是退出循环。
目录
相关文章
|
2月前
|
移动开发 前端开发 JavaScript
详细解读canv的基本语法
详细解读canv的基本语法
13 0
|
3月前
|
存储 Serverless C语言
c基本语法
c基本语法
23 1
|
3月前
|
存储 Serverless C++
c++基本语法
c++基本语法
32 0
|
3月前
|
存储 程序员 Serverless
C++ 基本语法
C++ 基本语法
25 0
|
3月前
|
C语言 Python
【关于C的一些较为特殊的语法】
【关于C的一些较为特殊的语法】
20 0
|
3月前
|
C++
C++基本语法
C++基本语法
37 0
|
3月前
|
C语言
C 基本语法
C 基本语法。
24 0
|
11月前
KATEX简易语法
KATEX简易语法
83 0
|
安全 编译器 C#
2.1C#新语法
C#实用新语法