JVM
栈
每个方法都有一个栈帧,栈帧中存放该方法的成员变量。
堆
基本数据类型在堆中都有初始值
GC:垃圾回收机制
基本数据类型与引用数据类型
基本数据类型
八种,只有一块存储空间,在栈中存放的是具体的值
引用数据类型
注意基本数据类型和引用数据类型的值传递问题
匿名对象与构造器
匿名对象
-
实例化一个对象,只是在堆中开辟一块新的内存空间,但是没有把该空间的地址赋值给任何一个变量
-
因为没有名字,所以匿名对象只能使用一次,一般把匿名对象作为方法的实参传递
构造器
- 完成对象的初始化工作
- 名称与类名相同
- 禁止有返回类型,也不能使用void作为返回值类型
- 构造器不能使用return
- 构造器其实有返回值,返回的是当前创建对象的地址
- 构造器可以自定义和重载
Static
-
static修饰的内容,随着类的加载而加载
当 JVM 把字节码加载到虚拟机中,static修饰的成员会自动加载到内存当中(方法区)
-
static修饰的内容,被该类型的所有对象所共享
-
static修饰的内容,可以直接使用类名来调用
代码块
静态代码块
和类一起加载(即加载字节码时调用),在main方法之前就执行了,只执行一次
可用来做一次性的初始化操作
static {
name
}
初始化代码块
定义在类中,创建对象时加载,每创建一个对象都会调用一次,但是在构造方法之前加载(实际上就是放在构造函数中执行)
{
}
执行顺序:
静态代码块 > 初始化代码块 > 构造方法
- 类的加载时间:当第一次创建该类对象的时候,加载到 JVM 中,在加载时会执行static
- 字段初始化问题
- 静态字段:在静态代码块中初始化
- 非静态字段:在构造函数中初始化
Final关键字
-
修饰
字段:该字段不能再去被修改
方法:子类不能再去覆盖该方法
类:该类就不能再被继承
-
final修饰字段时,必须手动设置初始值
-
final修饰变量时,就该表一个常量,全部用大写字母命名
-
final可以在局部代码块中使用
-
如果final修饰的是基本数据类型,代表值不能再被修改 (String除外)
-
如果final修饰的是引用数据类型,代表地址不能再被修改 (String除外)
抽象 abstract
抽象方法
- 抽象类中的方法只有方法名,没有方法的实现
- 抽象方法不能是私有的private,不能用final修饰,不能用static
- 抽象方法必须在抽象类中
- 抽象类中也可以写普通方法
- 抽象类有构造函数
抽象类
- 抽象类不能创建对象,只能靠子类去实现方法
- 抽象类当中,可以有抽象方法,也可以有非抽象方法(给子类调用使用)
- 有构造器,但是构造器不能私有
- 不能使用final关键字
接口
- 接口中没有构造器
- 接口不能被实例化创建对象
- 接口中定义的变量,都是全局静态常量
- 接口中定义的方法都是公共的抽象的方法
- 接口中的方法没有方法体,必须要被重写
- 接口可以多继承(extends),但是不会去覆盖父接口的方法
抽象与接口的异同
相同点:
- 都是被其他类继承或者实现
- 都不能实例化
- 都可以定义抽象方法,定义的抽象方法子类都必须得覆盖
不同点:
- 接口没有构造器,抽象类当中有
- 抽象类可以包含抽象方法和普通方法
- 接口只能定义抽象方法,不能有普通方法(java8以后可以有)
- 接口中默认成员变量 public static final 变量 ----> 静态常量; 抽象类中 默认的权限
- 接口中方法 public abstract 方法名; 抽象类 默认的权限
内部类
实例内部类
-
属于对象的内部类,不属于类的,不适用static修饰的内部类
-
在内部类当中可以直接访问外部类当中的成员
-
外部类不能直接访问内部类当中的成员
-
变量的访问原则:就近原则
-
在内部类当中不能有静态的成员
静态内部类
-
在内部类前面加上static
-
不需要创建外部对象
-
没有外部类的引用
-
可以访问外部类的静态成员与普通变量
-
访问静态内部类中的静态成员 Outter.Inner.color
-
静态内部类当中可以定义静态成员,也可以定义非静态成员
局部内部类
定义在方法中的类
- 不能使用一些修饰符 public private …
- 局部内部类只能在定义的方法当中使用
- 局部内部类当中不能包含静态变量
- 局部内部类当中可以包含局部变量,使用的局部变量本质上是final 常量
匿名内部类
没有名字的局部内部类
-
没有构造器
-
只使用一次的时候 ,去使用匿名内部类
-
new 父类的构造器 或 接口() {
内部写的代码(new的时候就会自动执行)
}
枚举
定义
枚举:表示一个事件的固定状态
java枚举:
- 是一个特殊的类,多个常量对象的集合,其实是继承了Enum类
- 私有化了构造器,不能再创建对象
- 定义了两个静态常量和一个存储所有常量的数组
- 常量的值其实就是创建的对象,把所有的常量都放在了数组中
[修饰符] enum 枚举的名称 {
常量1,常量2,常量3 …
}
public enum WeekDay{
MONDAY,TUESDAY,WENDESDAY,THURSDAY,FRIDAY,SATURDAY,SUNDAY
}
使用
WeekDay.MONDAY