03.Java基本语法
关键字与保留字
关键字(keyword)的定义和特点:
定义:被Java语言赋予了特殊的含义
特点:所有的关键字都是小写的
保留字(reserved word):现有Java版本尚未使用,但以后版本可能当作关键字使用 goto const
标识符(indentifier)
Java对各种变量、方法和类等要素命名时使用的字符序列成为标识符
技巧:凡是可以自己起名字的地方都叫标识符
定义合法标识符规则:
- 由26个英文字母大小写,0~9,_或$ 组成
- 数字不能开头
- 不可以使用关键字和保留字
- 严格区分大小写,长度无限制
- 标识符 不能含有空格
Java中的名称命名规范:
包名:多单词组成时所有字母都小写:xxxyyyzzz
类名:接口名:多单词组成时,所有首字母大写:XxxYyyZzz
变量名、方法名:多单词组成时,第一个单词首字母小写,从第二个单词开始每个单词首字母小写:xxxYyyZzz
常量名:所有字母都大写。多单词时每个单词用下划线连接:XXX_YYY_ZZZ
变量
概念:
- 内存中的一个存储区域
- 该区域的数据可以在同一个类型范围内不断变化
- 变量是程序中最基本的存储单元。包含变量类型、变量名和存储值
作用:用于在内存中保存数据
注意:
- Java中的每个便令必须先声明,后使用
- 使用变量名来访问这块数据的区域
- 变量的作用域:其定义在一对{}内
- 变量只有在作用域中才能生效
- 同一个作用域不能定义重名的变量
基本数据类型(primitive type)
数值型
- 整型(byte,short,int,long)
byte 1字节(8bit位) -127 ~127
short 2字节 -215~ 215-1
int 4字节 -231~231-1
long 8字节 -263~263-1
注意:声明long型常量须后加'l'或'L' - 浮点型(float,double)
float(单精度) 4字节 (7位有效数字) -3.403E38~3.403E38
double(双精度) 8字节 -1.798E308~1.798E308
注意:Java的浮点型常量默认位double类型,声明float型常量需要在后面加'f'或'F'
字符型(char)
char 2字节 声明char型变量通常使用单引号'' 反义字符''
布尔型(boolean)
只能取两个值之一:true,false
基本数据类型注意点:
- 自动类型提升
byte、short、char --> int --> long --> float --> double
结论: 当容量小的数据类型的变量和容量大的数据类型的变量做运算时,结果自动提升为容量大的数据类型,特别的:当byte,short,char三种类型做运算时结果为int类型(包括同种类型之间做运算)
容量大小表示数的范围大和小并不是内存中所占字节的大和小比如:float容量要大于long的容量 - 强制类型转换:自动类型提升的逆运算
- 需要使用强转符:()
- 注意点:强制类型转换,可能导致精度损失。
特殊情况:
long l = 123123
进行了自动类型提升,他认为123123是int型从而不用加l
long l = 12312312312312312
会报错,后边的值超过int类型的大小所以后边必须加l
byte b = 12; byte b1 = b+1;//报错,整型默认类型为int型,浮点型常量默认类型为double类型 float f1 = b +12.3;//报错
引用数据类型(reference type)
该数据类型在创建的时候,会先在堆内存中分配一块空间,存储对象的具体信息,然后在栈中存储该对象的地址信息,
1、引用数据类型是由类加载器创建的,他们是用于访问对象的;
2、任何引用数据类型的默认值都为空。
3、不能有NULL引用,引用必须与合法的存储单元关联(指针则可以是NULL)。
4、一旦引用被初始化,就不能改变引用的关系(指针则可以随时改变所指的对象)。
5、一个引用数据类型可以被用于任何生命类型和兼容类型的对象;
字符串类型:String
- String属于引用数据类型,字符串
- 声明String 类型变量使用一堆""
String s1 = "123"
- String可以和8中基本类型变量做运算,且运算只能是连接运算:+
int number = 1001; String numberStr = "学号"; String info = number + numberStr; //10001学号 ”+“连接运算符
char a = ''//编译不通过
类(class)(字符串在这)
接口(interface)
数组([]array)
进制
所有数字在计算机底层都以二进制形式存在。
对于整数,有四种表示方式:
- 二进制(binary):0,1,满2进1,以0b或0B开头
- 十进制(decimal):0-9,满10进1
- 八进制(octal):0-7,满8进1 以数字0开头
- 十六进制(hex):0-9及A-F,满16进1,以0x或0X开头表示,此处的A-F不区分大小写。如0x21AF+1=0x21B0
计算机底层都以补码的方式来存储数据
关于原码,补码,反码:
正数的原码补码和反码都一样
负数的原码为正数的符号位变为1,反码为除符号位取反,补码为反码+1。
有补码求原码:先将补码-1,再除符号位外,取反
十进制转换为二进制:除二取余的逆 比如 13 13除以2 商6余1 6除2 商3余0 3除2 商1余1 1除以2 商0余1 0除以2 商0余0 后将余数取反为 1101
十进制转换为其他进制可先转换为二进制,在转换为其他进制
二进制转换为八进制取三位为一位,反之亦然
二进制转换为十进制取四位为一位,反之亦然
运算符
- 算术运算符
- 正号"+"
- 负号"-"
- 加"+"
- 减"-"
- 乘"*"
- 除"/" 除数和被除数中含有浮点型变量,结果为浮点型
- 取模(取余)"%" 结果的符号与被模数相同
- 自增 ++(前:先运算后取值,后:先取值后运算) 不会改变变量自身的数据类型
- 举例:
a = 2; b = a ++;
结果:a = 3; b = 2;
a = 2; b = ++a
结果:a=3;b=3
- 举例:
- 自减 -- (前:先运算后取值,后:先取值后运算)
- 字符串连接 +
- 赋值运算符
符号: "="
当"="两侧数据类型不一致时,可以使用自动类型转换或者使用强制类型转换原则进行处理
支持连续赋值
int i1 = 10; int j1 = 10; int i2,j2; i2 = j2 = 10; int i3=10,j3=20;
扩展运算符:+=,-=,*=,/+,%= 不会改变本身数据类型
int a = 10; a += 10; //相当于a = a+10;
-
比较运算符 比较结果不是true 就是false
- == 是否相等
- != 是否不等
- >
- <
- >=
- <=
- instanceof 检查是否是类的对象 "hello" instanceof String --- true
-
逻辑运算符 逻辑运算符操作的都是boolean类型的变量
- & 逻辑与
- | 逻辑或
- ! 非
- && 短路与
- || 短路或
- ^ 逻辑异或
区分& 和 &&:运算结果相同,符号左边是true时,二者都会执行符号右边的运算,符号左边时false时,&&不会执行符号右边的运算(|| 和| 同理,左边为true ||不会执行后边的操作)
-
位运算符 (整数类型)
<< 左移 空位补0,被移除的高位丢弃,空缺位补0 在一定范围内,每向左移几位相当于原来数的大小乘于移动的位数
>> 右移 被移位的二进制最高位是0,右移后空缺位补0,最高位是1,右移后空缺位补1 在一定范围内,每向右移动几位相当于原来的数的大小除以2
>>> 无符号左移 空缺位都用0补
& 与运算 0 看作false 1看作true
| 或运算
^ 异或运算 交换两个数字的值 (num1^num2)^num1 = num2
~ 取反运算 -
三元运算符
(条件表达式)?表达式1:表达式2 条件表达式为true 执行表达式一 反之执行表达式二 -
运算符的优先级:
流程控制
顺序结构
- 程序从上到下逐行地执行,中间没有任何的判断和跳转
分支结构
- 根据条件,选择性的执行某段代码
- 有if...else...和switch-case两种分支语句
if(){ }else if(){ }else{ }
补充1:(如何从键盘获取不同类型的变量,需要使用Scanner类)
具体实现步骤:
- 导包:import java.util.Scanner
- Scanner的实例化
Scanner scanner = new Scanner(System.in); int num = scanner.nextInt();
注意:需要根据对应的方法,来输入指定的类型。如果输入的数据类型与要求的类型不匹配,会报异常:InputMisMatchException,导致程序终止
补充2:(如何获取随机数)
double value = Math.random();
[0.0,1.0) 乘100 0.0
例:生成一个10-99的随机数:(int)Math.random*(99-10+1)+10
公式:生成一个[a,b)的随机数。(int)Math.random*(b-a+1)+a
关于if...else...
- else结构是可选的
- 针对于条件表达式:如果多个条件表达式之间是“互斥”关系(或没有交集的关系),哪个判断和执行语句的顺序无所谓,如果多个条件表达式之间有交集的关系,需要根据实际情况考虑清楚,应该把哪个条件写到上边
- if-else是可以嵌套的
关于switch-case结构
switch(表达式){
case 常量1:
语句1;
break;
case 常量2:
语句2;
break;
case 常量n:
语句n;
break;
dafault:
语句;
break;
}
注意:
1、根据switch中的值依次匹配各个case的常量,一旦匹配成功,则进入相应case结构,调用其执行语句,当调用完执行语句之后,则仍然继续向下执行其他case结构中的执行语句,直到遇到break关键字或此switch-case结构末尾结束为止
2、break,可以在switch-case中,一旦执行到此关键字,就跳出该switch-case
3、switch结构中的表达式,只能是如下6中数据类型之一:byte、short、char、int、枚举类型(5.0)和String类型(7.0)
4、case后边必须跟常量,不能声明范围
5、default:相当于ifelse中的else,default也是可选的,而且位置是灵活的
6、如果switch-case结构中的多个case的执行语句相同,可以考虑合并
循环结构
- 根据循环条件,重复的执行某段代码
- 有while,do...while...、for三种循环语句
- jdk1.5提供了foreach循环方便遍历集合、数组元素
- 循环结构的4个要素
- 初始化条件
- 循环条件---是boolean类型
- 循环体
- 迭代条件
- for循环结构
for(1;2;4){
3
}
执行过程:1-2-3-4 - while循环结构
1
while(2){
3,4
}
执行过程1,2,3,4 - do...while循环
1
do{
3,4
}while(2);
执行过程:1,3,4,2 do...while...do里面的至少执行一次循环体 - break和continue
break:结束当前循环
结束指定标签的for循环:
label:for(;;){ for(;;){ break label; } }
continue:结束当次循环
衡量一个功能代码的优劣:
- 正确性
- 可读性
- 健壮性
- 高效率与低存储:时间复杂度,空间复杂度(衡量算法的好坏)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· 写一个简单的SQL生成工具