匿名类 内部类 匿名内部类
匿名类(可以是接口 抽象类 普通类):
1:无需创建对象
2:直接重写方法
new Anonymous(){
@Override
public void anonymousMethod(){
System.out.println("我是匿名类");
}
}.anonymousMethod();
内部类:若一个事物里面包含其他事物可以用这种结构
内部类可以直接访问外部类的成员,但外部类访问内部类必须建立内部类对象。
public class InnerTest {
public static void main(String[] args) {
// 创建外部类对象
OutPerson outPerson = new OutPerson();
// 创建内部类对象
OutPerson.InnerHeart innerHeart = outPerson.new InnerHeart();
// 调用内部类方法
innerHeart.heartMethod();
// 调用外部类方法
outPerson.setLive(false);
// 调用内部类方法
innerHeart.heartMethod();
}
}
class OutPerson {
private boolean live = true;
class InnerHeart {
public void heartMethod() {
// 直接访问外部类成员
if (isLive()) {
System.out.println("心脏在跳动");
} else {
System.out.println("心脏不跳了");
}
}
}
public boolean isLive() {
return live;
}
public void setLive(boolean live) {
this.live = live;
}
}
匿名内部类:匿名类与内部类的结合
应用场景减少重复代码,我们并不能把一段代码抽取成参数,但我们可以把他抽取一个类;
这样子就可以做到每次都重写变化逻辑 而 固定逻辑不动
//作为内部类
public interface AnonymousInnerClassExtraMethod {
public void otherMethod();
}
public class AnonymousInnerClass {
public static void main(String[] args) {
//内部类 作为 外部类的入参
AnonymousInnerClassExtraMethod anonymousInnerClassExtraMethod = new AnonymousInnerClassExtraMethod() {
@Override
public void otherMethod() {
System.out.println("变化逻辑");
}
};
parentMethod(anonymousInnerClassExtraMethod);
//使用匿名内部类的方式简化
parentMethod(new AnonymousInnerClassExtraMethod() {
@Override
public void otherMethod() {
System.out.println("变化逻辑");
}
});
//lambda表达式的简化:只能用于只有一个抽象方法的接口 会直接把该逻辑替换进去
parentMethod(() -> {
System.out.println("变化逻辑");
});
}
//内部类 作为 外部类的入参
public static void parentMethod(AnonymousInnerClassExtraMethod anonymousInnerClassExtraMethod) {
System.out.println("开始 其他固定逻辑");
//执行变化的业务逻辑
anonymousInnerClassExtraMethod.otherMethod();
System.out.println("最后 其他固定逻辑");
}
}
网友评论