学习匿名内部类
/**
* 匿名内部类
*
* 一 定义:
* new 接口(){//重写或实现抽象方法}
* new 父类([实参列表]){//重写或实现抽象方法}
*
* 二 要求
* 1 仅且实现一个接口或继承一个父类
* 2 不可以是抽象类,必须实现所有的抽象方法(来自实现树或继承树)
* 3 不可以定义构造器
*
*
* 三 匿名内部类创建本类的实例(匿名内部类的对象访问自定义的成员两种情况)
* // 注意:
* //第一种情况无法访问 ,该对象被User类限制了
* User user = new User(){ }
* //第二种情况可以访问自己声明的成员,var为声明为本类,var 只能声明局部变量,不可以声明成员变量
* var user = new User(){String name = "tom"; }
*
* 四 注意
* 1 创建内部类的匿名内部类对象和内部类对象的区别,是否有大括号.
* var a = new User().new A();//创建内部类对象
* var a = new User.A(){};//创建内部类的匿名内部类对象
* 2 匿名内部类和普通内部类没有什么区别,只能包含实例成员(成员变量,方法,内部类,代码块),不可以包含静态成员
* 3 可以选择哪个父类的构造器,去创建父类的对象
* 4 局部变量a被匿名内部类访问后,则a自动使用了final修饰,不论在匿名内部类内部或在之后都不可以修改
* 5 匿名内部类除了包含局部内部类声明和作用范围都在在代码块,普通方法,构造器里等相同点,还可以给成员变量赋值,活在类/实例的声明周期里
*
*
*/
//测试匿名内部类
public class 匿名内部类 {
public static void main(String[] args) {
int i = 1;//初始化一个局部变量i值为1;
// User user = new User(){ // 该user对象被User类限制了,如下输出除了第一行输出语句,其他输出语句全部报错
var user = new User(){//第二种情况可以访问自己声明的成员,var为声明为当前对象类型
{
System.out.println("我是匿名匿名内部类的实例初始化块,现在访问局部变量i: " + i);
}
String name = "我是匿名内部类的实例变量name";
String hobby = "吃饭";
public void eat(){
System.out.println(name + "爱好" + hobby);
}
class Detail{
int age = 55;
char gender = '男';
}
};
//我是User实例变量name(输出这句话,说明匿名内部类可以给成员变量赋值,符合创建上面的匿名内部类对象,父类的nme实例变量会先初始化)
//我是匿名内部类的实例初始化块,现在访问局部变量i: 1(执行匿名内部类的实例代码块,输出这句话)
System.out.println(user.name); //我是匿名内部类的实例变量name(访问覆盖父类User的实例变量name
System.out.println(user.hobby); //吃饭(访问自定义的实例变量hobby)
System.out.println(user.new Detail().age); //55(创建匿名内部类的实例内部类的实例,并访问它的实例成员age)
System.out.println(user.new Detail().gender);//男(创建匿名内部类的实例内部类的实例,并访问它的实例成员gender)
user.eat(); //我是匿名内部类的实例变量name爱好吃饭(访问自定义的实例方法)
//System.out.println(i++);//(i已经被匿名内部类访问过了,现在有对他进行修改,输出报错)
//(如上验证了匿名内部类可以包含实例成员(成员变量,方法,内部类,代码块)并且都可通过访问)
}
}
class User{
匿名内部类 name = new 匿名内部类(){{
System.out.println("我是User实例变量name");
}};
}
如下窗口输出
我是User实例变量name
我是匿名匿名内部类的实例初始化块,现在访问局部变量i: 1
我是匿名内部类的实例变量name
吃饭
55
男
我是匿名内部类的实例变量name爱好吃饭
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报