今天是来到天亮的第16天,今天主要讲了内部类和设计模式。
内部类:定义在类里的类,一般是让外部类使用,还有可以访问外部类私有化属性。
分类 :
成员变量 --> 成员内部类/普通内部类
静态变量 --> 静态内部类
局部变量 --> 局部内部类
形参/实参 --> 匿名内部类
可以看似。
内部类分为:成员内部类,静态内部类,局部内部类,匿名内部类。
成员内部类:
不能有静态声明,可以用权限控制修饰符,可以直接访问外部类属性。
内部类的类名 : 外部类$内部类。
静态内部类:
可以用权限控制修饰符,可以声明所有属性,静态成员
可以访问外部类静态属性,加上外部类名可以访问成员属性。
局部内部类:
不能有静态声明,不能用static和权限控制修饰符修饰,
如果外部方法是静态方法,则局部内部类不能直接访问外部类的成员属性,
如果外部方法 是成员方法,则局部内部类中可以直接访问外部类的所有属性。
如果使用外部方法中的局部变量,变量必须用final修饰(1.8开始,可以省略)
匿名内部类:(重点,用的最多)
在方法调用的时候,需要传入一个类的对象,这个时候可以直接传入一个匿名内部类,一般该对象,是接口的实现类对象,匿名内部类 等于是子类,可以使用super等关键字;
语法 : 方法(new 父类/接口(){ 类体 });
好处 少定义一个类,缺点 无法重复使用.
设计模式:
人们总结的编码方式,形参了固定的结构,就是固定模式。
单例模式 :实例化多次,得到同一个对象,让某个类只能被实例化一次。
实现思路:
1.不能让用户创建对象,构造方法私有化
2.对象由我们创建一个给用户,并只创建一次即可,提供获取对象的方法,必定是静态方法(成员方法需要对象调用,而没有对象)。
3.保证每次创建的对象地址唯一,设定一个变量局部变量 : 具有临时性,方法执行完后就不存在了,下一次调用该方法时,变量重新初始化
成员变量 : 静态方法中不能 操作成员变量
静态变量 : 和类相关,和类生命周期一致
所以应该创建一个用来保存当前类对象的静态变量
过程:1.构造方法私有化2,提供一个私有的静态的用来保存当前类对象的静态变量,3提供一个公共的静态方法,用来获取该对象
根据创建对象时机不同,分为两种1.懒汉模式,用的时候在创建对象2.类加载直接创建对象。
区别:1.内存,懒汉模式好一些,恶汉浪费内存
2.线程安全:饿汉模式是在类加载阶段就初始化的,所以在多线程环境下没有问题,因为类在生命周期中只会加载一次,懒汉模式在多线程并发性的情况下,就不行了,可能创建多个对象,但是可以通过双重校验加锁解决
所以,一般我们使用懒汉模式居多,尽管在多线程下,也使用懒汉模式,使用双重校验加锁解决并发问题即可 。
工厂模式:
工厂模式顾名思义就是创建一个工厂类,要什么就输出什么,在增加产品时,不必更改用户类代码,只需更改工厂类代码即可。
但是工厂模式会增加代码复杂度,因为增加了类,所以在复杂的对象关系中才适合使用工厂模式,简单的对象无需使用工厂模式,徒徒增加复杂度。例:
public class DaiMa8 {
public static void main(String[] args) {
A a = new A();
// a = new B();
a = AFactory.getA();
a = AFactory.getB();
a = AFactory.getC();
a = AFactory.getA();
a = AFactory.getA();
a = AFactory.getA();
}
}
class AFactory {
public static A getA() {
return new A();
}
public static B getB() {
return new B();
}
public static C getC() {
return new C();
}
}
class A {
}
class B extends A {
}
class C extends A {
}