1.语法基础
1.1标识符
1.标识符可以由字母、数字、下划线(_)、美元符($)组成。
2.不能以数字开头。
3.严格区分大小写。
4.不能是java的关键字。
1.2运算符
1.+ - * /
2.取余%
3.自增自减运算符
++ :表示变量本身的值+1 – : 表示变量本身的值-1
前缀式:符号在前,先改变变量本身的值,再使用,比如打印,计算…
后缀式:符号在后,先使用,再改变变量本身的值
4.比较运算符
!=,==,>,<.>=,<= 比较的结果都是布尔类型的
5.逻辑运算符
&&:双与/短路与:逻辑与单与相同,全真才真,只不过增加了短路的效果
||:双或/短路或:逻辑与单或相同,全假才假,只不过增加了短路的效果
6.三目运算符
格式:1?2:3; 1是表达式,若1为真则取2,若1为假则取3
2.基本类型
2.1类型转换
1.boolean类型不参与类型转换
2.小转大,直接转 – 隐式转换
3.大转小,强制转 – 显式转换,格式:byte b = (byte) a;
4.浮点数变整数,小数没 – 浮点型转整形是直接舍弃所有的小数部分的,不会四舍五入
2.2字面值规则
1.整数默认为int类型
2.小数默认为double类型
3.byte short char 三种比int小的类型,可以使用范围内的值直接赋值
4.字面值后缀:L F D
5.字面值前缀:0b-二进制 0-八进制 0x-十六进制
2.3运算规则
1.运算结果的数据类型与最大类型保持一致
2.3种比int(byte、float、char)小的类型,运算时会自动提升成int再运算
3.整数运算溢出的问题,一旦溢出,数据就错误了
4.浮点数运算不精确
5.浮点数的特殊值 Infinity NaN
3.流程控制
3.1分支结构
if(判断条件){
执行代码;
}
3.2多分支结构
if(判断条件){
执行代码;
}else{
执行代码;
}
3.3嵌套分支结构
if(判断条件){
执行代码;
}else if(判断条件){
执行代码;
}
3.4选择结构
switch(条件){
case 1: 操作1; break;
case 2: 操作2; break;
default: 以上条件都不符合执行此操作;
}
3.5循环结构
for(开始条件;循环条件;更改条件){
循环体;
}
4.成员变量与局部变量
4.1成员变量:
1)位置:类里方法外
2)有默认值,不需要手动赋值
3)在整个类中生效,类消失,成员变量才会随之释放
4.2局部变量
1)位置:方法里/局部代码块里
2)必须要手动初始化
3)在方法里/局部代码块中,对应的代码执行完毕后,局部变量也随之释放
5.方法
5.1格式
修饰符 返回值类型 方法名(参数列表){
方法体;
}
5.2方法重载
1.在同一个类中
2.多个方法的方法名相同
3.同名方法的参数列表不同
1)如果参数个数不同,一定构成重载
2)如果参数个数相同,需要查看对应位置上的参数类型,与参数名无关
5.3方法重写
前提:子类继承父类
语法规则:
两同:子类与父类的方法名和参数列表相同
两小:1.子类方法的返回值类型 < 父类方法的返回值类型
2.子类方法抛出的异常类型 < 父类方法抛出的异常类型
一大:子类方法的修饰符 > 父类方法的修饰符
5.4重载与重写的比较
1.重载:在一个类中的现象,同一类中,存在方法名相同,参数列表不同的方法
2.重写:是指建立了继承关系以后,子类对父类的方法不满意,可以重写,遵循两同两小一大的原则
3.重载的意义:是为了外界调用方法时方便,不管传入什么样的参数,都可以匹配到对应的同名方法
4.重写的意义:在不修改源码的情况下,进行功能的修改与拓展
6.数组
6.1数组创建
静态创建
int[] a = {1,2,3};
int[] a = new int[]{1,2,3};
动态创建
int[] a = new int[3];
6.2数组的创建过程
1.在内存中开辟连续的空间,用来存放数据
2.给数组完成初始化过程,给每个元素赋予默认值
3.数组完成初始化会分配一个唯一的地址值
4.把唯一的地址值交给引用类型的变量a去保存
5.如果想要操作数组中的元素,可以根据变量保存的地址找到数组,然后根据下标来操作数组的具体元素
数组名保存的是数组的地址值,不是数组中每一个具体的元素,数组名是一个引用类型的变量
6.3数组的特性
1.数组一旦创建,长度无法改变
2.数组的下标从0开始,最大下标为数组长度-1
6.4数组的工具类Arrays
1.toString(数组名),除了char类型外,其他类型的数组想要查看数组的具体元素,都得使用这个方法,如果不用的话,打印的是数组的地址值。
2.sort(数组名),给数组排序
3.copyOf(要复制的数组,新数组的长度)
不管是什么长度,都不会修改原数组,而是创建新数组
4.System.out.println(Arrays.toString(方法名); 可以查看数组中有那些元素
7.面向对象
7.1三大特征之一——封装
7.1.1为何要进行封装
1.封装可以提高程序的安全性
2.封装可以让资源按照我们预先规定的方式来操作
7.1.2属性的封装
用private修饰属性,一旦属性被修饰,就只能在本类中使用,外界无法访问,需要提供供外界访问的get()与set()方法。
7.1.3方法的封装
用private修饰方法,如果想要调用私有方法的功能,就需要在本类的公共方法里调用这个私有方法。
7.2三大特征之一——继承
1.继承的关键字:extends
2.继承相当于子类把父类的功能复制了一份,包括私有资源
3.Java支持单继承:一个子类只能有一个父类
4.继承具有传递性
5.子类只可以使用父类的非私有资源,原因是私有资源不可见
6.子类可以拥有自己的特有功能
7.继承耦合性非常强
继承中构造方法的使用
1.我们每次创建对象的时候,都会触发构造函数
2.创建子类对象时,会先调用父类的无参构造,因为子类的构造函数中默认存在一个super();
3.如果父类没有无参构造的话,我们需要手动指定子类去调用父类的含参构造super(参数);
4.构造方法不可以被继承,原因是:构造方法名必须是本类的类名,不可能在子类中存在一个父类名字的构造方法。
7.3三大特征之一——多态
**前提:**继承 + 重写
口诀:
1.父类引用指向子类对象
父类类型的引用变量保存的是子类类型的对象的地址值
2.编译看左边,运行看右边
编译时要看父类是否定义了这个资源,运行时使用的是子类的功能
多态的使用
1.成员变量使用的是父类的
2.成员方法使用的是父类的方法定义,子类的方法体
3.如果多态对象调用的是子类没有重写过的方法,方法定义与方法体使用的都是父类的,所以这个不符合多态的前提,直接使用纯纯的父类对象调用即可
4.静态资源属于类资源
8.构造、代码块
8.1构造函数
**格式:**与本类类名相同,且没有返回值类型
**作用:**创建对象,创建一次,执行一次构造函数
分类:
1)无参构造:默认存在,如果添加了其他构造,默认的构造函数会被覆盖
2)含参构造:对于参数没有任何要求,有参数就行
3)全参构造:全参构造的参数必须与本类属性一致
全参构造不仅可以创建对象,还可以给对象的所有属性赋值。
8.2构造代码块
**位置:**类里方法外
**执行时机:**每次创建对象时执行,并且优先于构造方法执行
**作用:**用于提取所有构造方法的共性功能
8.3局部代码块
**位置:**方法里
**执行时机:**调用本局部代码块所处的方法时执行
**作用:**用于控制变量的作用范围
8.4静态代码块
格式: static{}
**位置:**类里方法外
**执行时机:**随着类的加载而加载,优先于对象进行加载(只加载一次)
**作用:**用于加载那些需要第一时间就加载,并且只加载一次的资源,常用来初始化
8.5代码块执行顺序
静态代码块 -> 构造代码块 -> 构造方法 -> 普通方法(如果普通方法里有局部代码块,执行局部代码块)
- 如果有多个静态资源,加载顺序取决于先后位置
- 静态资源不可以与this与super共用
9.关键字
9.1this的用法
1.当成员变量与局部变量同名时,使用this指定成员变量
2.使用this在构造方法的第一行调用构造方法的功能
this(); 调用的是本类的无参构造
this(参数); 调用的是本类对应参数的构造方法
9.2super的用法
1.当父类的成员变量与子类的成员变量同名时,使用super.变量名指定父类的成员变量
2.使用super在子类构造方法的第一行调用父类构造方法的功能
super(); 调用的是父类的无参构造
super(参数); 调用的是父类对应参数的构造方法
9.3static关键字
1.static可以修饰成员变量和方法
2.静态资源随着类的加载而加载,最先加载,优先于对象进行加载
3.静态资源可以通过类名直接调用,也被称作类资源
4.静态被全局所有对象共享,值只有一份
5.静态资源只能调用静态资源
6.静态区域内不允许使用this与super关键字
9.4final关键字
1.修饰类:最终类,不可以被继承
2.修饰方法:这个方法的最终实现,不可以被重写
3.修饰常量:值不可以被更改,并且常量定义时必须赋值
- 常量的定义需要使用全大写,单词之间使用下划线分割