1.局部内部类
- 局部内部类等同于局部变量
- 注意 : 局部内部类 在访问外部方法中的局部变量的时候需要加final修饰(1.8之前),从1.8开始 final可以省略
- 局部内部类中,不能有静态声明
- 如果是成员方法中的局部内部类,可以访问外部类中所有 的属性
- 如果是静态方法中局部内部类, 不可以直接访问外部类的成员属性
public static void m2() {
int i = 2;
class InnerClass {
// 不能有静态声明
// public static void m3(){}
public void m3() {
System.out.println(s1);
// 因为是静态方法中 的内部类,所以不能直接访问外部类的成员属性,需要创建对象
// System.out.println(s2);
OuterClass_03_ a = new OuterClass_03_();
System.out.println(a.s2);
System.out.println(new OuterClass_03_().s2);
}
}
InnerClass ic = new InnerClass();
ic.m3();
}
2.匿名内部类
匿名内部类 : 指在方法调用时,实参需要传入某个接口对象的时候,不传入对象,传入一个匿名的实现类
- 如果方法定义形成 一般是个接口,那么调用的时候,就需要传入其实现类的对象
- 但是可以不实现这个接口,不传递实现类对象,传递一个匿名内部类,这个类,没有名字,不能复用
- 默认的匿名内部类类名 : 外部类类名$1 一次类推
- 那么既然是没有名字的类,那么我们自然无法创建对象,但是传入匿名内部类的 时候回自动创建一个对象
m1(new ICustomerService() {
int i = 2;
@Override
public void logout() {
System.out.println("已退出登陆" + this);
}
});
m2(new A(){
public void m3(){
System.out.println("sssssss");
super.m3();
}
});
public static void m1(ICustomerService cs) {
cs.logout();
}
public static void m2(A a) {
a.m3();
}
3.单例设计模式
//懒汉式,类名调用才创建对象
class single{
private static single s;
//构造方法私有化,不能再别的类直接new创建
private single(){
}
//若没创建对象,则创建一个,若创建了,就用创建的那个,不新创建了
public static single getInstance(){
if (s == null) {
s = new single();
}
return s;
}
}
//饿汉式,类加载后就创建对象
class hungry{
private hungry(){
}
//在类加载时即创建对象
private static hungry h = new hungry();
public static hungry getInstance1(){
return h;
}
}
4.工厂模式
火箭筒类
//许多实现类继承武器接口
public class RPG implements Weapon {
public void fire() {
System.out.println("hong~");
}
}
武器接口
//武器接口,抽象方法
public interface Weapon {
public void fire();
}
武器工厂
public class Weapon_Factory {
//返回值多态, 返回一个子类,返回任意武器,但是用户不知道是什么,运行了才晓得
public static Weapon getWeapon(){
return new RPG();
}
}
//主类调用方法
public static void main(String[] args) {
fight(Weapon_Factory.getWeapon());
}
public static void fight(Weapon w){
w.fire();
}
如下图所示: