快捷键
自动补齐:alt+/
向下复制一行:ctrl+alt+↓
删除当前行:ctrl+D
整体取消缩进:shift+tab
数据类型
基本数据类型
- 数值类型:
- 整数:
- byte:8位
- short:16位
- int:32位
- long:64位
- 小数:
- float:32位
- double:64位
- 整数:
- 字符类型:char:16位
- 布尔类型:boolean:8位
引用数据类型
String字符串
字符串的拼接
数据类型的转换
- 手动转换(强制转换)
- 自动类型转换
- 两端数据类型一致
- 数值运算时,自动把小的类型转换为大的类型
- jvm在运算时,识别的最小类型为int
运算符
算术运算符(+-*/++--)
- 0不能做除数,但被除数类型为double时结果为无限大。
- 取余运算时,余数符号取决于被除数符号
- 运算符最小识别int类型
short a; a = a + 1;//a+1自动转换为int类型,复制给short a时会报错,正确代码为:a=(short)(a+1); a+=1;//自动强制转换为short类型,等价于a=(short)(a+1);
赋值运算符(= += -= *= /=)
注意数据类型之间的转换
比较运算符(== != > < >= <= )
比较运算符的结果为布尔类型
三元运算符
格式:逻辑表达式?表达式1:表达式2
如果逻辑值为true,返回表达式1的值
如果逻辑值为false,返回表达式2的值
逻辑运算符(& | ! ^ && ||)
异或(^)
格式:逻辑表达式1^逻辑表达式2
表达式结果相同为false,不同为true
方法
- 方法必须声明到类(class)中
- 创建的方法要在其他的方法之外
- 定义方法不分先后顺序
类
描述特征:成员变量
行为:方法
对象的创建:必须现有类再有对象
格式:类 对象名 = new 类()
JVM内存划分
JVM将内存主要划分为:
- 方法区(静态区):存放所有class文件和staic变量
- 栈:每个函数从调用到结束,对应一个栈帧的入栈和出栈
- 本地方法栈:存放本地方法,为Native方法服务
- 堆:被所有线程共享的一块区域,对象和数组都在堆上分配(带new关键字的)
- 程序计数器:记录当前执行到哪个指令
方法栈帧
每个方法有自己栈帧,自己的成员变量放在自己的栈帧内
堆
使用new关键字在堆中分配空间,并将堆中地址进行赋值
引用数据类型
说明:使用new关键字创建出来的类型都是引用数据类型
存储方式:引用数据类型有两块存储空间,一个在栈中,一个在堆中,栈中存放的是堆中的地址
- 类
- 接口
- 数组
- 枚举
- 注解
构造器
定义:在创建对象时自动调用的方法。在类中找不到默认的构造器,通过反编译工具可以看到默认的构造方法。
使用:创建对象,必须和new一起使用
特点:
- 构造器名称和当前所在类的名称相同
- 禁止定义返回类型(不要使用void作为返回类型)
- 在构造器中,不需要使用return语句
- 构造器中是有返回值的,返回的是当前创建对象的引用
默认构造器的
特点:
- 符合构造器的特点
- 无参数的
- 如果类A没有使用public修饰,则编译器的创建的构造器也没有public修饰,使用了public修饰,则编译器创建的编译器也使用public修饰
自定义构造器
特点:
- 自己写的构造器,就叫自定义构造器
- 如果自己定义了构造器,编译器就不再创建默认构造器
- 一个类至少存在一个构造器
- 创建对象就是在调用构造器
static修饰符
范围:修饰字段,方法,内部类
作用:确定修饰的内容是是属于类还是属于对象
特点:
- static修饰的内容,附着类的加载而加载(当jvm把class字节码加载到虚拟机时,static修饰的成员已经自动加载到内存中了
- 优先于对象的存在(对象时手动new出来,所以肯定是自动加载时快呗)
- static修饰的成员被该类型的所有对象共享(该类创建出来的对象,都可以访问static成员,表面上是通过对象访问,其本质依然使用类名访问,和对象没有任何关系
- 可以直接使用当前类的类名访问static成员(因为static修饰的成员属于类,不属于对象
深入理解变量
定义:数据类型 变量名 = 值;
类型:根据定义位置不同,分为成员变量和局部变量
注意:成员变量可以先使用后定义,局部变量必须先定义后才能使用
成员变量
定义:也称全局变量或字段,不叫属性
说明:直接定义在类中,方法的外面
分类:
- 类成员变量:使用static修饰的字段
- 实例成员变量:没有使用static修饰的字段
- 在方法中不能定义static变量,static属于类,方法属于对象
初始值:初始化(new)才会在内存中开辟空间,默认是有初始值的,数值型为零,字符型为null
作用域:在整个类中都有效
局部变量
定义:除了成员变量,其他的都是局部变量
分类:
- 方法内部的变量
- 方法的参数
- 代码块中的变量
初始值:没有初始值,所以必须先初始化才能使用
作用域:只在它定义的大括号内生效
包
说明:就是一个个用来给java分类的文件夹
作用:
- 把功能相似或相关接口组织在同一个包中,方便类的查找和使用
- 同一个包中的类名字是不同的,不同的包中的类的名字是可以相同的,当同时调用两个不同包中相同类名的类时,应该加上包名加以区别
- 包也限定了访问权限,拥有包访问权限的类才能访问每个包中的类
语法:package 包名.子包名.子子包;
定义规则:
- 全部小写
- 域名倒写(域名倒写.模块名.组件名;)
import语句
说明:当A类和B类不再同一个包中,若A类需要使用到B类,此时就得让A类中去引入B类
修饰符
public修饰符(公共访问权限)
- 当前类:可以访问
- 同一包中:可以访问
- 子孙类:可以访问
- 其他包:可以访问
protected修饰符(子类访问权限)
- 当前类:可以访问
- 同一包中:可以访问
- 子孙类:可以访问
- 其他包:不能访问
private修饰符(类访问权限)
- 当前类:可以访问
- 同一包中:不能访问
- 子孙类:不能访问
- 其他包:不能访问
默认(包访问权限)
- 当前类:可以访问
- 同一包中:可以访问
- 子孙类:不能访问
- 其他包:不能访问
this关键字
定义:this是当前对象所创建的地址
特点:
- 解决成员变量和参数得问题
- 同类中实例方法互相调用,可以省略this
- static不能和this一起使用(?)
- 构造器得重载互调,this()代表得构造器名,必须写到第一行
- this可以做为参数传递
继承
定义:在已有类中,派生出新的类,新的类中吸收已有类当中的状态和行为,并能扩展出新的能力
实质:是使用已有类作为基础,建立新的类
关键字:extends
格式:public class 子类类名 extends 父类类名{状态,行为}
继承关系:
- 父类中成员使用public修饰,子类继承
- 父类成员使用protected修饰,子类不同包也能继承
- 父类成员为默认的,同包可继承,不同包不能继承
- 父类成员使用private(只能在本类中使用)修饰,子类无法继承
- 父类的构造器子类也无法继承(构造器必须与当前类名相同
方法覆盖
定义:当父类某个方法不适合子类本身特征时,可以进行重新定义父类中的方法
原则:
- 方法返回类型,方法名,方法参数必须相同
- 子类方法的访问权限比父类方法访问权限要更大或相等
判定是否为覆盖方法:
在方法前添加@override标签,编译通过,为覆盖方法,反之
super关键字
定义:在某个子类中调用父类被覆盖的方法
instanceof关键字
判断一个类是否是一个指定的类,如果是返回true,否则返回false
使用方法:类名 instanceof 类名
通常配合if使用
多态
定义:把子类对象赋给父类变量,在运行时期会表现出具体的子类特征调用子类的方法
作用:把不同子类对象都当作父类类型看待,可以屏蔽不同子类对象之间的实现差异
创建对象时,编译看左边,运行看右边
对象调用的字段为对象左边类的字段
代码块
局部代码块
直接定义在方法当中的代码块(一般结合if,while,for使用)
初始化代码块
直接定义在类中的代码块(每次创建对象时,都会执行初始化代码块)
初始化代码块本质不放到构造方法中执行
静态代码块
初始化:初始化静态代码块前加static
在加载字节码时自动调用
在主方法前执行一次,只执行一次
静态代码块随着字节码加载也加载进jvm此时main方法还没有执行,因为方法需要jvm,jvm再去调用main方法,用来做一次性初始化操作
单例设计模式
定义:通过单例模式可以保证系统中,应用该模式的类一个类只有一个实例,即一个类只有一个对象实例
特点:
- 单例类只能由一个实例
- 单例类必须自己创建自己的唯一实例
- 单例类必须给所有其他对象提供这一实例
优点:
- 控制资源的使用
- 控制实例的产生数量,达到节省资源的目的
- 作为通信媒介,数据共享
实现:
- 必须得要在该类中创建一个对象出来
- 私有化自己的构造器,防止外界通过构造器来创建新的对象
- 给外界提供一个方法,能够获取已经创建好的对象

工具类
定义:把一些经常使用的功能写在一个类中,以后使用该功能时,直接调用
工具类通常放在util/utils或tool/tools中
实现:
- 工具类当中的方法我们一般都会设计成静态方法,直接使用类名调用
- 如果一个工具类中的方法没有使用static,我们一般都把工具类设计为单例通过单例获取对象调用工具方法
- 如果工具类全部使用static修饰,说明工具方法只需要使用工具类名调用即可,此时必须把工具类的构造器私有化,防止创建对象调用静态方法
包装类
定义:基本数据类型变量不是对象,不符合一切皆对象,所以,可以把基本数据类型进行包装,把基本数据类型包装一个对象,把基本数据类型变的更强大,以面向对象的思想去使用这些类型
优点:
- 数字基本数据类型无法设为null,包装后可以
- 包装类中给我们提供了很多方法,可以直接拿过来使用
装箱操作
定义:把基本数据类型变更包装类
实现:
Integer num = new Integer(10); Integer num2 = Integer.valueOf(20);
自动装箱
定义:可以直接把一个基本数据类型的值赋给包装类对象
实现:
Integer i = 20; System.out.println(i);
拆箱操作
定义:把包装类转成对应的基本数据类型
实现:

自动拆箱
可以直接把一个包装类对象赋值给基本数据类型的变量
实现:
int i1 = i; system.out.println(i1);
字符串转成包装类型

包装类型转换为字符

基本数据类型转字符串

字符串转换为基本数据类型

字符串转boolean

valueof缓存设计
定义:当使用valueof创建一个包装类,它内部的实现会先从缓存当中查看是否已经有该存在匹配条件的值,如果有就直接返回,不会再去创建新的地址,如果没有,就去创建新的地址(缓存大小为-128-127)



抽象类
抽象类特点:
- 抽象类必须要有子类才行,不能被final修饰(抽象类一般当作父类来继承),子类没有覆盖抽象方法,子类也要是抽象类
- 抽象类是不能创建对象的,但是抽象类有构造器,且构造器不能定义为私有化
- 抽象类中,可以有抽象方法,也可以有非抽象方法(给子类调用)
实现:
abstract class Graph{
abstract Double getArea();
void test(){
system.out.println();
}
}
抽象方法特点:
- 抽象方法没有方法体
- 抽象方法必须定义在抽象类或接口中
- 抽象方法不能是私有的private,final,static
实现:
abstract calss Graph{
abstract Double getArea();
}
抽象类与普通类的区别
- 普通类有的(方法,字段,构造器),抽象类都有
- 普通类可以创建对象,抽象类不能创建对象
- 抽象类可以包含抽象方法,也可以包含非抽象方法
- 抽象类必须有子类才有意义
接口
定义:用来约束使用者怎么做,接口就是一种规范,规定了类里必须提供的方法
内部类
作用:
- 增强封装,把内部类隐藏在外部类中,不允许其他类访问这个内部类
- 增加代码维护性
外部类的修饰符只能有public和默认的
内部类的修饰可以任意使用
实例内部类
直接定义在类中的一个类
在类前没有任何一个修饰符
实现:

1.如果想使用内部类,必须先创建外部类

2.在内部类中可以访问外部类当中的成员

3.在内部类中,不能有静态成员

4.外部类是不能访问内部类当中的成员

变量的访问:就近原则

局部内部类
定义:定义在方法中的内部类
特点:
- 不能使用public,private修饰符
- 局部类只能在定义的方法中使用


![缓存[-128-127]数字](https://www.7z7z7z.cn/wp-content/themes/begin/prune.php?src=https://www.7z7z7z.cn/wp-content/uploads/2020/06/image.png&w=280&h=210&a=&zc=1)



