关键字的特点 完全小写纯英文字母 有颜色
标识符 在程序中,我们自己定义的内容,比如类名,方法名,和变量名,都是标识符
命名规则(硬性要求) 可包含英文字母,数字,$和 _ 不能以数字开头 不能是关键字
(软性要求) 类名大驼峰 变量名以及方法名用小驼峰
常量 在程序运行期间,固定不变的量
分类 字符串(双引号) 双引号中可以为空
整数常量
浮点数常量
字符(单引号)常量 两个单引号中必须有且仅有一个字符
布尔 常量 只有true和false
空(null)常量 不能直接打印null
基本数据类型(引用数据类型:字符串、数组、类、接口、lambda)
整数型 byte1 short2 int4 long8
浮点型 float4 double8
字符型char2
布尔型boolean1
注意事项:字符串不是基本类型,而是引用类型
浮点数可能只是一个近似值,并非精确值
数据范围与字节数不一定相关,float数据范围比long更加广泛,但是float是4字节,long是8字节
浮点数默认类型是double,如果一定使用float类型,需加上一个后缀F。
如果是整数,默认为int 类型,如果一定使用long类型,需加上后缀L。
变量:程序运行期间,内容可以发生改变的量。
定义格式 数据类型 变量名称; //创建变量
变量名称 = 数据值; //给其赋值
另一种 数据类型 变量名称 = 数据值;
注意事项 多个变量之间名称不要重复
对于float和long类型,字母后缀F和L不要丢弃。
没有进行赋值的变量,不能直接使用
变量使用不能超过作用域(从定义变量的那一行开始,一直到所属的大括号结束为止) 的范围
数据类型的自动转换
特点:代码不需要进行特殊处理,自动完成
规则:数据范围从小到大
强制类型转换
特点:代码需要进行特殊的格式处理,不能自动完成
格式:范围小的类型 范围小的变量名 = (范围小的类型)原本范围大的数据;
注意事项:强制类型转换一般不推荐使用,有可能发生精度损失、数据溢出
byte/short/char这三种类型都可以发生数学运算
byte/short/char这三种类型在运算的时候,都会被首先提成int类型,然后再计算,
所以在接收时要用一个int类型的数据接收
运算符
四则运算(加减乘除) 与取模运算 对于一个整数表达式来说,除法用的是整除,整数除以整数,结果仍是整数,只看商,不看余数 只有对于整数的除法来说,取模运算符才有余数的意义
注意事项 一旦运算中有不同类型的数据,那么结果将会是数据类型范围大的那种
加法的三种用法 1数值加 2对于char类型,char类型会提升成int,然后再计算 3对于字符串来说,加号代表字符串连接操作 任何数据类型和字符串进行连接的时候,结果都会变成字符串例如 hello + 20 +30 会打印hello2030
自增自减运算符 使用方式 单独使用:不和其他任何操作混合,自己独立成为一个步骤 混合使用:和其他操作混合,例如与赋值或打印混合
使用区别 在单独使用时,前++和后++没有任何区别 在混合使用时,如果是前++,需要先加后用;如果是后++,需要先用后加;
此外还有赋值,比较(== , < > = !=)和逻辑运算符(按位与,按位或 ,非)
方法
方法名称的命名规则和变量一样,小驼峰
定义方法的格式 public static void 方法名(){
方法体
}
方法的调用 方法名称();
注意 方法的定义先后顺序无所谓 方法的定义不能产生嵌套关系
编译器的两点优化
对于byte/short/char 三种类型来说,如果右侧赋值的数值没有超过范围,那么javac编译器会自动隐含地为我们补上一个(byte)(short)(char)
在给变量进行赋值的时候,如果右侧的表达式当中全都是常量,没有任何变量,那么编译器将会直接将若干个
常量表达式计算得到结果。 short result = 5 + 8 ; 结果相当于short result = 13 ;右侧常量结果的数值,没有超过左侧范围,所以正确,但是一旦有变量参与,就不能进行优化了。如short = 5 +a +8; a的值不确定
顺序结构(简单)
判断语句(也叫选择结构)
1if(关系表达式){
语句体;
}
2if(关系表达式){
语句体;
}else{
语句体;
}
3if(关系表达式){
语句体;
}else if(判断语句){
语句体;
}
...
}else if(判断语句){
语句体;
}else{
语句体;
}
选择语句switch
switch (表达式){
case 常量值1:
语句体1;
break;
case 常量值2:
语句体2;
break;
...
default:
语句体;
break;
}
switch语句的注意
多个case后面的数值不可以重复 switch后面的小括号当中只能是以下数据:基本数据类型:byte/short/char/int 引用数据类型:String字符串、enum枚举
switch语句格式很灵活:前后顺序可以颠倒,而且break语句还可以省略
循环语句
for while do-while三种循环(凡是确定次数的多用for循环,否则多用while循环)
控制语句 break 一旦执行,整个循环语句立刻结束 continue一旦执行,立刻跳过当此循环,马上开始下一次循环
死循环的标准格式while(true){
循环体
}
方法的定义格式
修饰符 返回值类型 方法名称 (参数类型 参数名称 ,..){
方法体
return 返回值;
}
现阶段的固定写法 public static
返回值类型 也就是方法最终产生的数据是什么类型
方法名称 方法的名字,规则和变量一样 小驼峰
参数类型 进入方法的数据是什么类型
参数名称 进入方法的数据对应的变量名称
注意事项 参数如果有多个,使用逗号进行隔离 return后面的“返回值”,必须和方法名称前面的“返回值类型”保持一致
方法的调用格式
单独调用 方法名称(参数)
打印调用 sout(方法名称(参数));
赋值调用 数据类型 变量名称 = 方法名称(参数);
方法的有参数和无参数类型
有参数类型如 小括号当中有内容,必须给一些数据,才能运行
无参数类型 小括号当中留空,一个方法不需要任何数据条件,自己就能独立完成任务,例如定义一个方法,打印固定十次Hello
对于无返回值的方法,只能使用单独调用。
方法的注意事项
如果方法有返回值,那么必须加return return后面的返回值数据,必须和方法的返回值类型对应
对于一个void没有返回值的方法,不能写return后面的返回值,只能写return自己 ,也可以省略不写
方法的重载(Overload)多个方法名称(区分大小写)一样,但是参数列表不一样
方法重载注意
方法重载与下列因素相关 参数个数不同 参数类型不同 参数的多类型不同
方法重载与下列因素无关 与参数的名称无关 与参数的反回值类型无关
数组
数组是一种引用数据类型 数组中的多个数据,类型必须统一 数组的长度在运行期间不可改变
动态初始化 在创建数组的时候,直接指定数组当中的数据元素的个数
动态初始化数组格式 数据类型 [ ] 数组名称 = new 数据类型 [ 数组长度 ] 例 int [ ] arrayA = new int [300];
静态初始化 在创建数组的时候,不直接指定数据个数的多少,而是直接将具体的数据内容进行指定
静态初始化数组格式 数据类型 [ ] 数组名称 = new 数据类型[ ] {元素1,元素2,...}
使用静态初始化数组的时候,格式还可以省略一下 数据类型 [ ] 数组名称 = {元素1,元素2,... }
数组变量名中存储的是数组在内存中的地址,数组是一种引用类型
注意事项
其实静态数组在初始化的时候,也会有初始值,只不过被大括号中的具体值给替换了
数组是一种引用数据类型 数组中的多个数据,类型必须统一 数组的长度在运行期间不可改变
数据类型 [ ] 数组名称 也可以写成 数据类型 数组名称 [ ]
数组的遍历
快捷键:数组名.fori
求数组的最大值
我们一般注意的是在max初始化时一般定义数组的第一个元素为最大值,因为如果我们把max赋初值为0,如果数组中的元素全是负数,那么输出最大值会是0
冒泡排序
上图更好的理解,但是我们面试时希望我们写成下边的形式
左图更好的理解,但是我们面试时希望我们写成右边的形式
Java内存划分5个部分
栈(Stack): 存放的都是方法中的局部变量。方法的运行一定要在栈当中运行
局部变量: 方法的参数 或者是方法{ }内部的变量
作用域 :一旦超出作用域,立刻从栈内存当中消失
堆(Heap):凡是new出来的东西,都在堆中
方法区(Method Area):存储 .class相关信息,包含方法信息
本地方法栈(Native Method Stack):与操作系统相关
寄存器(pc Register): 与CPU相关
数组常见异常
数组索引越界异常(ArrayIndexOutOf...) 索引编号不存在时,将会发生
空指针异常 数组必须行new初始化才能使用其中的元素,如果只是赋值了一个null,没有进行new,那么将会发生空指针异常(NullPointerException)
获取数组的长度
数组名称.length 这将会得到一个int数字,代表数组的长度
数组一旦创建,程序运行期间,长度不可改变
数组作为方法的参数
当调用方法时,向方法的小括号进行传参,传递进去的其实是数组的地址值
例 public static void printArray(int[] array){
for( int i =0; i < array.length; i++){
System.out.println(array[i]);
}
}
数组作为方法的返回值
数组作为方法的返回值,返回值其实也是数组的地址值
public static int[]calculate(int a,int b,int c){
int sum = a + b +c ;
int avg = sum / 3;
int[] array = {sum,avg};
return array;
}
面向对象(强调对象) 当需要实现一个功能的时候,不关心具体步骤,而是找一个已经具有该功能的,帮我做事
面向过程(强调步骤)
面向对象三大特性 封装 继承 多态
类和对象
类是对一类事物的描述 ,是抽象的 对象是一类事物的实例,是具体的 类是对象的模板,对象是类的实体
类的定义
成员变量(属性):姓名 年龄
成员方法(行为):吃饭 睡觉 学习
注意事项 成员变量是直接定义在类当中的,在方法的外边 成员方法不要写static关键字
对象的创建及使用
导包 也就是指出需要使用的类,在什么位置
import 包名称.类名称
对于和当前类属于同一个包的情况下,可以省略导包语句
创建 类名称 对象名 = new 类名称();
使用 使用成员变量:对象名.成员变量名 使用成员方法:对象名.成员变量方法名(参数)
内存图
关于解释 首先在main方法当中调用call方法,指向 堆 当中的成员方法地址,然后再指向地址当中的成员方法,此时call 方法会进栈(此过程叫 压栈),执行完毕后,就会从栈当中消失
源代码如图
使用对象类型作为方法的参数 当一个对象作为参数,传递到方法当中时,实际上传递进去的是对象的地址值
使用对象类型作为方法的返回值(返回值也是地址值)
局部变量和成员变量不同点
定义的位置不一样 局部变量在方法内部 成员变量 在方法的外部,直接写在类当中
作用范围不一样 局部变量 只有方法当中才可以使用,出了方法就能再用 成员变量整个类都可以用
默认值不一样 局部变量没有默认值,如果想要使用,必须进行手动赋值 成员变量如果没有进行赋值,会有默认值,规则和数组一样
方法的参数是局部变量,但书写时没有直接赋值 因为参数在方法调用时,必然会被赋值的
Java的封装性
方法就是一种封装 关键字private也是一种封装
封装就是将一些细节信息隐藏起来,对外界不可见
private封装
一旦用private进行修饰,那么本类当中仍然可以随意访问,但是,超出了本类范围之外就不能在直接访问
但是,可以间接访问,定义一对儿Getter/Setter方法(命名 必须叫 setXxx或者getXxx)Xxx 就是被private修饰的那个
对于Getter来说,不能有参数,返回值类型和成员变量对应
对于Setter来说,不能有返回值,参数类型和成员变量对应
注意 对与布尔类型来说,getter方法要写成isXxx
this 关键字
当方法的局部变量和类的成员变量重名的时候,根据就近原则,优先使用局部变量
如果需要访问本类当中的成员变量 ,需要使用格式 this.成员变量名
构造方法
专门用来创建对象的方法,当我们通过关键字new来创建对象时,其实就是在调用构造方法
格式 public 类名称(参数类型 参数名称){
方法体;
}
注意事项 构造方法的名称必须和所在类名完全一样 不写返回值,void也没有
不能return一个具体的值 如果没有编写任何构造方法,那么编译器将会默认赠送一个构造方法
没有参数,方法体什么都不做 public Student(){}
一旦编写了一个构造方法,那么编译器不再赠送 构造方法也可以重载
完结...