目录
标识符
/*
标识符可以标识:类名,方法名,变量名,接口名,常量名
标识符命名规则:只能由数字,字母,下划线,美元符号组成(不能有空格),不能以数字开头,严格区分大小写,关键字不能做标识符,理论上无长度限制
标识符命名规范:最好见名知意,遵守驼峰命名方式(即一高一低):SystemService,UserService等,类名,接口名首字母大写,后面每个单词首字母大写
变量名,方法名首字母小写,后面每个单词首字母大写,常量名全部大写
*/
关键字
(都是小写的)
/*
public,static,void,if,for,while,do,default,
byte,short,int,long,float,double,boolean,char,
private,protected,switch,true,false,throw,throws,
try,catch。。。。。。
*/
字面值
/*
10,100
3.14
“abc”
‘a’
true,false
所有字符串型必须由“”
所有字符型必须由‘’
*/
变量
/*
变量包含三部分:数据类型,名称,字面值(数据)
变量是内存中存储元素的最基本单元
数据类型:不同的数据有不同的数据类型,不同的数据类型底层会分配不同的大小空间
声明/定义变量:数据类型 变量名
变量赋值:变量名=字面值(先运算等号右边的表达式然后赋值给等号左边的变量)
访问变量的两种方式:读取变量中保存的具体数据:get获取
修改变量中保存的具体数据:set设置
在同一个作用域中变量名不能重名,但变量可以重新赋值
关于变量的分类:局部变量:在方法体中声明的变量
成员变量:在方法体外,类体之内声明的变量
类体中不能编写java语句(声明变量除外)
*/
数据类型
/*
数据类型的作用是JVM在运行程序的过程中给该数据分配多大的内存空间
数据类型的分类:基本数据类型:四大类,八小种:第一类:整数型 byte,short,int,long
第二类:浮点型 float,double
第三类:布尔型 boolean
第四类:字符型 char
字符串不属于基本数据类型(String),属于引用数据类型:“abc”
基本数据类型占用空间大小:byte 1(字节) 取值范围:-128-127 可表示256个不同的数字
short 2
int 4
long 8
float 4
double 8
boolean 1
char 2
计算机在任何情况下都只能识别二进制:例:100100101010
八种基本数据类型中char表示的是现实中的文字,文字和计算机的二进制不存在转换关系的,
因此,人提前制定好文字和计算机二进制编码的转换关系,这种关系被称为“字符编码”。
最先出现的字符编码(支持英文)是ASCII码,当解码和编码本是同一套对照表时会出现乱码
java语言源代码采用的是unicode编码方式,所以标识符可以写中文
引用数据类型:
*/
转义字符 \
所以不能直接打印输出‘\’
/*
println表示输出完后要换行,print表示输出完后不换行
例:'\n'属于换行符,属于char数据类型
'\t'属于制表符(tab),在两个字母之间会有大空格
'\\'第一个反斜杠是转义字符,能将第二个反斜杠转义成普通的字符并输出
*/
整型
/*
java中编写整数型字面值一般有三种表示方式:
1.十进制:一种缺省默认的方式
2.八进制:要在开头加上0
3.十六进制:在开头加上0x
数据类型 取值范围
byte -128--127
short -32768--32767
int -2147483648-2147483647
long
计算机二进制三种表现形式
原码
反码
补码
正数的补码和原码相同
负数的补码:负数绝对值对应的二进制码,所有二进制取反再加一
*/
浮点型
/*
float单精度(4个字节)
double双精度(8个字节精度较高)
double的精度太低,不适合做财务软件,财务涉及到钱的问题要求精度较高,
所以有更准确的数据类型,只不过这种数据类型不是基本数据类型而是引用数据类型:java.math.BigDecimal
java程序员基于一套强大的类库进行开发,
java的SE类库字节码:"C:\Program Files\Java\jdk-14.0.1\lib\jrt-fs.jar"
java的SE类库的源码:"C:\Program Files\Java\jdk-14.0.1\lib\src.zip"
例如(String[] args)使用的就是String.class字节码文件
在java中所有float型字面值默认当做double类型来处理,要想把字面值当做float类型处理,必须要在字面值之后加上F
*/
布尔型
/*
在java语言中boolean类型只有两个值:true,false,没有其他值
底层存储boolean只占一个字节,因为false的底层是0,true的底层是1
八种基本数据类型转换规则:
除布尔类型外,其他七中数据类型可互相转换
小容量向大容量转换称为自动类型转换
容量从小到大排名:byte,short,int,long,float,double,char
char c=97(存在自动类型转换)
大容量转换为小容量需要强制类型转换,加上强制类型转换符,才能编译通过,在运行阶段会损失精度
当整数字面值没有超过byte,short,char的取值范围可直接赋值给byte,short,char类型的变量
byte,short,char混合运算时,先转化为int数据类型再做运算
多种数据类型混合运算时,先转化为容量最大的数据类型再做运算
*/
运算符
/*
算术运算符:
+ 加号
- 减号
* 乘号
/ 除号
% 求余数(取模)
++ 自加1
-- 自减1
关系运算符:
>,<,>=,<=,==,!= (==是关系运算符,=是赋值运算符)
关系运算符的结果一定是布尔类型:true/false,比较变量中保存的值的大小
逻辑运算符:要求两边的算子都是布尔类型,结果也必须是布尔类型
& 逻辑与(并且) 两边都是true才为真
| 逻辑或(或者) 两边只要有一个true就是真
! 逻辑非 取反
^ 逻辑异或 两边算子不一样就是真
&& 短路与 和逻辑与结果相同,存在短路现象
|| 短路或 和逻辑或结果相同,存在短路现象
字符串连接运算符:
“+”运算符在java中有两种作用:
加法运算符:加号两边都是数字才是加法运算
字符串连接运算:两边的数据有一个是字符串类型,一定进行字符串连接运算,运算结果还是字符串类型
三元运算符:
语法规则:布尔表达式?表达式1:表达式2(看布尔表达式为真时,把表达式1作为表达式运行结果,为假则把表达式2作为结果)
赋值类运算符:
基本赋值运算符:=
扩展的赋值运算符:扩展类的赋值运算符不改变运损结果类型
+= byte i=5 i+=5 ------- i=(byte)(i+5)一开始是byte型最后也应该强转为byte类型
-=
*=
/=
%=
*/
控制语句
/*
选择结构:
if,if...else
if语法:
第一种:
if(布尔表达式){
java语句
......
}
第二种:
if(布尔表达式){
java语句
}else{
java语句
}
第三种:
if(布尔表达式){
java语句
}else if(布尔表达式){
java语句
}else if(布尔表达式){
java语句
}
第四种:
if(布尔表达式){
java语句
}else if(布尔表达式){
java语句
}else if(布尔表达式){
java语句
}else{
java语句
}
switch
switch语法:拿括号中的数据和case中的数据进行匹配,匹配成功执行冒号后的java语句,
遇到break整个switch就结束了,假设第一个case中没有break,将不在判断第二个case是否匹配,
直接继续执行第二个case中的java语句,这种被称为case穿透现象
相同的Java语句在不同的case条件下可以合并
例:case语句合并
int i=10;
switch(i){
case 1:case 2:case 3:case 10:
java语句;
}
switch(int或String类型的字面值或变量){
case int或String类型的字面值或变量:
java语句;
...
break;
case int或String类型的字面值或变量:
java语句;
...
break;
case int或String类型的字面值或变量:
java语句;
...
break;
default:
java语句;
...
}
循环结构
for
for循环语法:
for(初始化表达式;布尔表达式;更新表达式){
Java语句;
}
执行过程:初始化表达式,布尔表达式,更新表达式都不是必须的,但两个分号一定要写,
初始化表达式一定是最先执行的,并且只执行一次,布尔表达式必须是true/false,
先执行初始化表达式,只执行一次,
再判断布尔表达式是True/false,
若为true,执行java语句,
执行更新表达式,
再判断布尔表达式真假,以此往复
若为false,循环结束
while
while语法:
while(布尔表达式){
循环体
}
循环原理:先判断布尔表达式的结果,若为真执行循环体,再判断布尔表达式结果,再执行循环体,再判断,再执行循环体......
do....while
do....while语法:
do{
循环体;
}while(布尔表达式);
循环原理:先执行循环体,再判断布尔表达式为真,再执行循环体,再判断,再执行循环体,直到为假....
控制循环的语句:
break
break语法:
可单独为一句java语句,可用在switch语句中,也可使用在循环语句中,
当循环到我们所需要的数据后即可以终止循环,这样可以减少资源的消耗
continue
continue语句:
表示继续,也可以continue关键字加分号构成的Java语句,
主要出现在循环语句中,用来控制循环语句的执行,表示当前本次循环结束,执行下一次循环继续执行
其他用法:continue+循环名称表示从那次循环开始执行
方法内存分配形式图
方法
//类体:
建议在一个Java文件中只定义一个class,即之只定义一个类名
/*
计算三个需求其实就是计算一个需求
计算两个int类型的数据之和
只不过每一次参与的数据不同
则可以用到方法
在Java中有这样一种机制
某个功能代码只需要写一遍
要使用这个功能,只需要给这个功能传递具体的数值
这个功能完成之后返回一个具体地结果
这样代码就可以重复利用,提高代码的复用性
方法的本质:就是一段代码片段,这段代码片段可以完成相应的功能,并且可以被重复使用
方法定义在类体当中,一个类体中可以定义多个方法,方法编写的位置没有先后之分,可以随意
方法体中不能再定义方法,方法由Java语句编写而成,方法体中的代码遵循自上而下顺序执行
1.方法的基础语法
方法的定义,语法结构:
[修饰符列表] 返回值类型 方法名 (形式参数表列){
方法体;
}
修饰符列表:先统一写成public static(以后讲)
方法修饰符列表中有static关键字时,怎么调用这个方法?
对于方法的修饰符列表中带有static关键字的方法,调用时,类名可以不写
若定义另一个类名A时,则在调用时即调用其他类中的方法,不是本类,必须加上类名.方法名,类名不能省,
类名.方法名(实际参数列表);
返回值类型:一个方法可以完成一个特定的功能,
这个功能结束时会返回一个特定的结果,执行结果可能是一个具体存在的数据,
该数据就是返回值,数据都是有类型的,此处指定的的数据的具体类型,
包括所有的基本数据类型和引用数据类型,若没有具体的返回值类型就写void
若不是void类型,则在方法体中必须写出return+值,并保证该值类型必须与返回值类型相同,否则就会报错
若是void类型,在方法体中不能写return+值这样的语句,但可以写return;(作用:强行终止当前执行的方法)这样的语句
只要带有return关键字的语句执行,return语句所在的方法结束
方法名:
只要是合法的标识符
最好见名知意
最好是动词
方法名首字母要小写,后面每个单词首字母大写,遵循驼峰书写
形式参数列表:
形参是局部变量:int a ,double b等等
形参的个数可以是多个
多个形参间用逗号隔开
形参中期关键作用的就是形参的数据类型,形参的名字就是局部变量的名字
方法在调用的时候要求形参和实参的个数和数据类型对应相同
类型不同的时候要求能够进行相应的类型转换(自动类型转换或强制类型转换)
深入return语句:
带有return关键字的语句只要执行,所在的方法执行结束,
在同一个作用域下,return语句不能编写任何代码,因为这些代码所愿执行不到
方法在执行过程中,在JVM中的内存是如何分配的,内存是如何变化的?(难点)看笔记
1.方法只定义,不调用,是不会执行的,并且在JVM中不会给该方法分配运行所属的内存空间,只有在调用时,才会分配运行内存空间
2.在JVM内存主要划分为3块内存空间:
方法区内存
堆内存
栈内存
3.方法代码片段属于.class字节码文件的一部分,字节码文件在类加载的时候将其放到了方法区中,
所以JVM的3块内存空间中方法区空间中最先有数据,存放了代码片段,代码片段在方法区内存中虽然只有一份,
但是却可以重复调用,调用时会分配所属的活动场所,活动场所在栈内存中分配,所以,栈内存中分配方法运行的所属内存空间
4.方法在调用时瞬间,会给该方法分配内存空间,此时在栈中将发生压栈动作,方法执行结束后,给该方法分配的内存空间会全部释放,此时发生弹栈动作
5.局部变量在方法体中声明,局部变量运行阶段内存在栈中分配
方法在调用的时候,在传递参数时,实际上传递的是变量中保存的那个值,而非变量
2.方法的重载机制overload
功能相似的时候,方法的名字可以相同,考虑方法重载机制虽然调用的不同方法,但却给人感觉在调用一个方法,代码美观
功能不相似的时候,尽可能让方法名不同
方法重载运用的条件:
1.在同一个类当中
2.方法名相同
3.参数列表不同:包括局部变量数量不同,顺序不同(int在前,double在后等等),类型不同(一个int类型,一个double类型)
4.用两个不同的返回值类型不能区分两个方法即不能使用方法重载,局部变量中的变量名也不能区分两个方法即不能使用方法重载机制
5,。方法重载机制只和方法名和参数列表有关,和返回值类型,修饰符列表无关
3.方法的递归调用
自己调用自己,递归必须有结束条件,没有结束条件一定会发生栈内存溢出
递归可以不使用尽量别用,除非必须用到递归,比如目录拷贝