内部类,被包含或者被嵌套在另一个类里,叫内部类
内部类分为:
成员内部类
局部内部类
静态内部类
匿名内部类
成员内部类:
作为外部类的成员,与成员变量成员方法平级
成员内部类访问权限任意
创建成员内部类
成员内部类是外部类的成员,需要通过外部类对象创建
//创建外部类对象
Out o=new Out();
//通过外部类创建内部类对象
Out.In inner=o.new In();
或者
Out.in inner =new Out.new In();
在成员内部类访问外部类成员
外部类属性和内部类属性不同名可以直接访问
外部类与内部类属性同名访问格式
外部类名.this.属性名
以此种格式来从内部类访问外部类属性
成员内部类不能包含静态成员
成员内部类的字节码格式
外部类名$内部类名.class
局部内部类
和类中方法的局部变量平级
局部内部类的访问只能是默认
创建局部内部类对象
直接在局部内部类所在的方法中创建对象并调用方法
在局部内部类中访问外部类的属性
不同名直接访问
同名外部类.this.属性名
局部内部类中不能包含静态成员
局部内部类中访问的局部变量必须是final常量jdk1.8之后final可以省略
字节码文件
外部类名$编号内部类名.class
静态内部类
static修饰成员变量成员方法,代码块
static关键字修饰是内部类
static修饰的内部类是静态内部类
static只能修饰类成员
使用static修饰的成员内部类是静态内部类
访问权限一般public
使用static修饰的内部类自动提升为普通类,相当于一个独立的类和外部类的级别相同
创建对象格式
不需要外部类的对象,可以直接创建静态内部类的对象
外部类.内部类 表示符=new 外部类.内部类构造方法
访问外部类成员
静态内部类能直接访问外部类的静态成员
非静态 的成员只能通过创建外部类的对象访问
静态内部类中可以包含静态成员
字节码文件格式
外部类名$内部类名.class与内部类一样
匿名内部类
没有名字的内部类
产生的原因,
接口和抽象类不能创建对象如果一个接口的实现类只需要使用一次或者一个抽象类只需要使用子类一次可以使用匿名内部类只能创建一个对象
匿名内部类必须把抽象方法全部实现
匿名内部类中可以声明独有的属性和方法
由于接口引用不能访问现实类中独有的属性和方法,所以一般不在匿名内部类中声明独有的属性和方法
匿名对象若在匿名内部类中声明了独有的方法或属性可以使用匿名对象访问不能通过对象.方法名访问
匿名内部类只能使用一次即使两次声明的匿名内部类完全一致也是两个匿名内部类
设计模式
特定的问题的特定解决方法
一个类只需要一个实例不能出现多个实例就叫单例
单例模式动机
一个系统或平台某个类的实例只需要有一个
实现原理:封装
得到一个类的对象需要通过new关键字调用构造方法创建对象
某个类只能有一个对象,但是构造方法一经调用就会产生新的对象,我们将构造方法私有化
此时类在外部不能创建对象,需要在类的内部创建对象
添加一个公开的方法返回这个对象
1私有化构造方法
2在类内创建对象
3提供一个共有的方法,用来获取本类对象
单例分为懒汉式和饿汉式
核心
构造方法私有,不能在类外随意创建对象,
在类内部声明一个本类静态对象作为属性
提供一个共有静态的方法来获取本类对象
懒汉式调用方法时初始化对象饿汉时声明同时初始化
使用上没有区别
存储空间,在第一次获取单例类对象前懒汉比恶汉节省空间
多线程操作时,懒汉存在线程安全,恶汉没有线程安全问题
简单工厂设计模式
把对象的创建交给一个独立的工厂类创建,把对象的创建和使用隔开
1父类产品 抽象类把需要的属性方法抽象出来
2子类产品 父类庞杂的方法细分
3工厂 实现具体的方法
4客户程序 调用方法