面向对象(二)
1. static关键字
可以用来修饰的结构:主要用来修饰类的内部结构
属性、方法、代码块、内部类
是否使用static修饰可分为静态属性和非静态属性(实例变量)
特点:
-
静态变量随着类的加载而加载,可以通过“类.静态变量”的方式进行调用
-
static加载的结构早于对象的创建
-
只要权限允许,可以通过“对象.static属性”的方式进行调用
-
静态变量存在于方法区的静态域中
2. final 关键字
final可以修饰类、变量(属性 + 局部变量)、方法
- final用来修饰一个类,不能被其他类所继承
- final用来修饰方法,方法不能被重写
- final用来修饰变量,此时变量就称为一个常量,修饰属性考虑赋值位置:显式初始化,代码块初始化,构造器初始化。static final 用来修饰属性:全局常量。
3.单例模式
特点:
- 单例设计模式保证一个类只有一个实例。
- 要提供一个访问该类对象实例的全局访问点。
3.1 饿汉式(预先加载方式)
设计步骤:
-
提供私有构造器
-
内部创建类的对象
-
提供公共的静态方法,返回类的对象
-
要求此对象也必须声明为静态的
特点: 对象预先加载,线程是安全的,在类创建好的同时对象生成,调用获得对象实例的方法反应速度快,代码简练。
class Bank{ private Bank{ } private static Bank instance = new Bank(); public static Bank getInstance(){ return instance; } } public class BankTest{ public static void main(String[] args){ Bank bank1 = Bank.getInstance(); Bank bank2 = Bank.getInstance(); System.out.println(bank1 == bank2); } }
3.2 懒汉式(延迟加载方式)
设计步骤:
- 提供私有构造器
- 声明当前类对象,没有初始化
- 声明public、static的方法返回当前类的对象
- 要求此对象也必须声明为静态的
特点:对象延迟加载,效率高,只有在使用的时候才实例化对象,但若设计不当线程会不安全,代码相对于饿汉式复杂,第一次加载类对象的时候反应不快。
class Order{
private Order{
}
private static Order instance = null;
public static Order getInstance(){ //多線程安全
if(instance == null){
synchronized(Order.class){
if(instance == null){
instance = new Order();
}
}
}
return instance;
}
}
4.类的属性赋值
方式顺序:
①默认初始化
②显示初始化 / ⑤代码块中初始化 (看先后顺序)
③构造器初始化
④通过"对象.属性"或"对象.方法"的方式赋值
执行先后顺序: ① - ② / ⑤ - ③ - ④