Java拾贝第六天——匿名内部类
1.Java拾贝第一天——数据类型与运算符杂记2.Java拾贝第二天——方法、方法的重载3.Java拾贝第二天——面向对象4.Java拾贝第三天——面向对象25.Java拾贝第四天——String和匿名对象6.Java拾贝第四天——面向对象37.Java拾贝第四天——动态绑定机制8.Java拾贝第五天——抽象和接口9.Java拾贝第五天——静态和代码块10.Java拾贝第五天——内部类
11.Java拾贝第六天——匿名内部类
12.Java拾贝第七天——包装类、BigInteger、BigDecimal13.Java拾贝第七天——异常14.Java拾贝第七天——throws和throw、自定义异常15.Java拾贝第七天——断言16.Java拾贝第八天(补档!)——访问修饰符,命名规范17.Java拾贝第八天——多线程的创建18.Java拾贝第八天——线程的状态和常用方法19.Java拾贝第九天——synchronized关键字20.Java拾贝第九天——泛型21.Java拾贝第十天——通配符与泛型22.Java拾贝第十一天——IO之File类23.Java拾贝第十一天——IO流之字节流24.Java拾贝第十一天——IO流之字符流25.Java拾贝第十一天——IO流之字节流复制图片、视频26.Java拾贝第十二天——IO流之打印流27.Java拾贝第十二天——System类28.Java拾贝第十二天——IO流之转换流29.Java拾贝第十二天——IO流之对象序列化与对象流30.Java拾贝第十三天——集合之List31.Java拾贝第十四天——集合之Set32.Java拾贝第十五天——集合之Iterator迭代器33.Java拾贝第十五天——集合之Map34.Java拾贝第十六天——集合之Queue、Stack35.Java拾贝第十六天——其他集合类Properties36.Java拾贝第十七天——反射之初识Class类37.Java拾贝第十七天——反射之认识反射相关类38.Java拾贝第十八天——反射之使用反射修改属性39.Java拾贝第十九天——注解Java拾贝不建议作为0基础学习,都是本人想到什么写什么
匿名内部类
匿名对象没忘吧?
new Person();//语法同匿名内部类
匿名内部类就是匿名的局部内部类,地位同局部变量。
有两种形式:基于接口的匿名内部类,基于类的匿名内部类
基于接口的匿名内部类
常规方式实现接口需实现类实现接口并重写其方法
public class Test6 {
public static void main(String[] args) {
A a=new B();
a.say();
}
}
interface A{//定义接口
void say();
}
class B implements A{//定义其实现类
@Override
public void say() {
System.out.println("常规方式实现接口并重写方法");
}
}
//常规方式实现接口并重写方法
常规方式的实现接口:
- 先定义接口
- 再定义实现类
- 再初始化对象并调用方法
如果该实现类复用率不高的话其实非常不方便(这种显式定义实现类的方式也叫硬编码)。
如果某实现类使用次数少的话可以采用匿名内部类的方式:
public class Test6 {
public static void main(String[] args) {
A a = new A() {//对象a指向的一个实现A接口的匿名内部类
@Override
public void say() {
System.out.println("匿名内部类实现接口");
}
};
a.say();
}
}
interface A{
void say();
}
//匿名内部类实现接口
其内部结构如下:
A a=new A(){//匿名内部类的好处就是可以马上初始化
@Override
public void say() {
System.out.println("匿名内部类实现接口");
}
};
a.say();
其实就是一个匿名的局部内部类,通过编译后就是如下形态
class XXX$1 implements A{
//匿名内部类 类名一般是外部类名 ($后的数字是匿名内部类出现次数)
@Override
public void say() {
System.out.println("匿名内部类实现接口");
}
}
A a=XXX;
a.say();
至此,相对于常规方式实现接口:
- 定义接口
- 直接初始化并调用方法
基于类的匿名内部类
常规方式继承类并重写其方法(类与类的关系肯定是继承)
public class Test6 {
public static void main(String[] args) {
A a=new B();
a.say();
}
}
abstract class A {//抽象类普通类都可以
public abstract void say();
}
class B extends A {
@Override
public void say() {
System.out.println("常规方式继承类并重写方法");
}
}
常规方式重写类方法:
- 先定义父类
- 再定义子类
- 再初始化对象并调用方法
如果该类复用率不高的话其实非常不方便(硬编码别忘了)。
如果某类使用次数少的话可以采用匿名内部类的方式:
public class Test6 {
public static void main(String[] args) {
A a=new A() {
public A(String name){//匿名内部类不允许重写构造方法
}
@Override
public void say() {
System.out.println("匿名内部类重写类方法");
}
};
a.say();
}
}
abstract class A {
public A(){
System.out.println("抽象类也可以有构造方法");
}
public abstract void say();
}
/*
抽象类也可以有构造方法
匿名内部类重写类方法
*/
其内部结构如下:
A a=new A() {
@Override
public void say() {
System.out.println("匿名内部类重写类方法");
}
};
a.say();
//或者可以写成如下:
new A() {
@Override
public void say() {
System.out.println("匿名内部类重写类方法");
}
}.say();//但是只能使用一次,连引用的变量都没了
其实就是一个匿名的局部内部类,通过编译后就是如下形态
class XXX$1 extends A{
@Override
public void say() {
System.out.println("匿名内部类重写类方法");
}
}
A a=new XXX$1();
a.say();
至此,相对于常规方式重写类方法:
- 定义父类
- 直接初始化并调用方法
注意!!!!!!!
new A(){//这是匿名内部类
};
new A();//这是匿名对象
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~