一、类在什么时候加载
- 创建对象实例时
- 创建子类对象实例,父类也会被加载,而且父类先被加载,子类后被加载
- 使用类的静态成员时(静态属性,静态方法)
二、类方法使用注意事项
-
类方法和普通方法都是随着类的加载而加载,将结构信息储存在方法区。类方法中无this参数。
-
类方法可通过类名或对象名调用
-
普通方法和对象有关,需要通过对象名调用,不能通过对象名调用
-
类方法中不允许使用和对象有关的关键字,如this、super
-
静态方法只能访问静态的成员;非静态方法可以访问静态成员和非静态成员
三、深入理解main方法
形式: public static void main(String[] args)
- main方法是虚拟机调用
- java虚拟机需调用main方法,因此需要public修饰符
- java虚拟机在执行main()方法时不必创建对象,因此该方法必须是static
- 该方法接收String类型的数组参数
四、代码块
-
static代码块是在类加载时执行,只会执行一次,且只能调用静态成员
-
普通代码块是在创建对象时调用,创建一次,调用一次
-
创建一个对象时,在一个类调用顺序时:
(1)调用静态代码块和静态属性初始化
(2)调用普通代码块和普通属性初始化
(3)调用构造方法(构造器隐藏了了super和调用普通代码块)
-
创建一个子类对象时(继承关系),在一个类的调用顺序(口诀:由父及子,静态先行)
(1)父类的静态代码块和静态属性初始化
(2)子类的静态代码块和静态属性初始化
(3)父类的普通代码块和普通属性初始化
(4)父类的构造方法
(5)子类的普通代码块和普通属性初始化
(6)子类的构造方法
五、单例设计模式
单例设计模式:采取一定的方法保证在整个软件系统中,对某个类只能存在一个对象实例,并且该类只提供一个取得其对象实例的方法
饿汉式:(可能创建了对象,但没有使用实例)
- 构造器私有化(防止直接new)
- 类的内部创建对象
- 向外暴露一个静态的公共方法
懒汉式:(只有当用户使用getInstance时,才返回对象)
- 仍然私有化构造器
- 定义一个static静态属性对象
- 提供一个public的static方法(先判断需创建的对象是否为空),可以返回一个Cat对象
饿汉式 | 懒汉式 | |
---|---|---|
创建时机 | 类加载时 | 对象使用时 |
线程安全问题 | 不存在 | 存在 |
浪费资源 | 存在 | 不存在 |
六、抽象类
-
用abstract关键字,这个类就叫抽象类
访问修饰符 abstract 类名{
}
-
用abstract关键字来修饰一个方法时,这个方法就是抽象方法
访问修饰符 abstract 返回类型 方法名(参数列表);//没有方法体
-
抽象类的价值更多作用在于设计,是设计者设计好后,让子类继承并实现抽象类
抽象类使用细节
- 抽象类不能被实例化
- 抽象类不一定要包含abstract方法
- 一旦类包含了abstract方法,则这个类必须声明为abstract
- abstract只能修饰类和方法,不能修饰属性和其它的
- 抽象类可以由任意成员**【抽象类还是类】**,例如:非抽象方法、构造器、静态属性等
- 抽象方法不能有主题
- 如果一个类继承了抽象类,则它必须实现抽象类的所有抽象方法,除非它自己也声明为abstract类
- 抽象方法不能被private、static、final修饰
七、接口
接口就是给出一些没有实现的方法,封装到一起,到某个类要使用的时候,再根据具体情况把这些方法写出来
语法
interface 接口名{
//属性
//方法
}
class 类名 implements 接口{
//自己属性
//自己方法
//必须实现的接口的抽象方法
}
- 注:Jdk7.0前,接口里的所有方法都没有方法体,即都是抽象方法;Jdk8.0后接口中可以有静态方法和默认方法,在接口中,可以省略public abstract关键字
接口使用细节
- 接口不能被实例化
- 一个普通类实现接口,就必须将该接口的所有方法都实现
- 抽象类实现接口可不用实现接口的方法
- 一个类可以同时实现多个接口
- 接口中的属性只能时final的,并且默认为public static final修饰
- 接口中属性的访问形式:接口名.属性名
- 接口不能继承其它的类,但是可以继承多个接口
interface extends IA,IB{}
- 接口的修饰符只能时public和默认
接口与继承的区别
-
接口和继承解决的问题不同
(1)继承:主要解决代码的复用性和可维护性
(2)接口:设计。设计好各种规范(方法),让其它类去是实现这些方法 -
接口比继承更加灵活
继承是满足 is-a 的关系,而接口只需满足 like-a 的关系 -
接口在一定程度上实现代码解耦【接口规范性+动态绑定】