首页 > 编程知识 正文

匿名内部类没有构造方法,内部类的实现方式

时间:2023-05-03 16:28:16 阅读:62822 作者:4518

匿名内部类

匿名内部类是指未命名的内部类

注意:

匿名内部类不能定义静态成员、方法。

匿名内部类的方法不能是抽象的;

匿名内部类必须实现接口或抽象父类的所有抽象方法。

匿名内部类访问的外部类的成员变量或成员方法必须用静态限定;

代码:

接口

publicinterfaceinner { public string say (; }抽象类

publicabstractclassinner1implements inner { }一般类别

public class inner2implements inner { public string say (} { return ' this is inner2'; }外部类

公共类外{公共静态字符串1=' thisiss1in outer '; 公共静态字符串2=' thisiss2in outer '; privatestaticstrings3=' thisiss3in outer '; 公共语音方法1 (inner inner ) system.out.println (inner.say ); }专用静态字符串方法2 () { return 'this is method2 in Outer '; } publicstaticvoidmain (string [ ] args ) { Outer outer=new Outer ); //测试1,Inner显示接口outer.method1(new inner ((string S1=' thisiss1in inner '; public String say ()//外部类和匿名函数类具有同名的变量s1 return s1; }; ); //测试2,Inner1是抽象类outer.method1(new inner1((strings2=' thisiss2in inner1) ); public String say ()//外部类和匿名函数类具有同名的变量s2 return Outer.s2; }; ); //测试3,Inner2通常访问类outer.method1(newinner2) ({ public String say ) )//外部类专用变量s3 return s3; }; ); //测试4,Inner2通常是类outer.method1(newinner2) ) { public String say )//外部类的专用方法method1) (return method2) ) }; ); }} 打印:

thisiss1ininnerthisiss2inouterthisiss3inouterthisismethod2in outer 3358 www.Sina.com /

编译后,将自动生成四个文件: Outer$1.class、Outer$2.class、Outer$3.class和Outer$4.class。

Outer.class反编译(属性值,方法内容略)。

publicclassjichu.outer { public static Java.lang.string S1; 公共静态Java.lang.string S2; privatestaticjava.lang.strings 3; 静态{ }; 公共jichu.outer (; 公共语音方法1 (jichu.inner ); privatestaticjava.lang.string method2(; publicstaticvoidmain (Java.lang.string [ ]; static java.lang.String access$0(; static java.lang.String access$1(; } Outer$1.class反编译(优化、已调整) ) ) ) )。

class outer $1implements inner { string S1=' thisiss1in inner '; 公共字符串say ((return this.S1; }} Outer$2.class反编译(已优化、已调整) ) ) ) )。

class outer $2extends inner1{ strings2=' thisiss2in inner1'; 公共字符串say () { return Outer.s2; }} Outer$3.class反编译(已优化、已调整) ) ) ) )。

class outer $3extends inner2{ public string say () { return Outer.access$0); }} Outer$4.class反编译(已优化、已调整) ) ) ) )。

class outer $4extends inner2{ public string say (} { return outer.access $1); }1、匿名内部类没有类名,请访问分析:

2、创建匿名内部类时,会立即创建其实例,请访问匿名内部类不能定义构造器

3、匿名内部类实现一个父类(只有一个)或一个接口),实现父类或接口中的所有抽象方法,可以重写父类中的方法,也可以添加自定义方法

5、如果匿名内部类和外部类有同名的变量(方法),则默认情况下必须访问匿名内部类的变量)方法,并为外部类命名才能访问外部类的变量)方法。

从Outer.class反编译代码中可以看到,会自动生成两个静态方法: access$0()和access$1),并在测试3和测试4中直接用Outer类名调用。 这提供了从内部类对外部类的私有成员变量和方法的访问。匿名内部类不能是抽象类,必须实现接口或抽象父类的所有抽象方法

内部类可以访问外部类私有变量和方法

匿名内部类不能包含静态变量和方法。 但是,测试发现变量可以用static final修饰。 为什么?

主要是因为final类型在编译时针对jvm进行了优化,常量池保留这些变量。 非静态内部类不能脱离外部类这一上下文实例化,但常量池使final变量脱离了类实例化的条件,并在编译时确定。

疑问

1、匿名内部类不能定义任何静态成员、方法。

2、匿名内部类方法不能抽象;

3、匿名内部类必须实现接口或抽象父类的所有抽象方法。

4、匿名内部类不能定义构造函数;

5、匿名内部类访问的外部类成员变量或成员方法必须用静态限定;

6、内部类可以访问外部类的私有变量和方法。 转载于:https://www.cn blogs.com/SQP 51312/p/6100314.html

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。