匿名内部类、内部类、静态内部类的区别和联系
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
匿名内部类、内部类、静态内部类的区别和联系
内部类与匿名内部类的区别
内部类有如下特征:
1.内部类被编译成名为OuterClassName$InnerClassName.class的类。
2.内部类可以引用定义在它嵌套的外部类中的数据和方法,所以不需要将外部类对象的引用传递给内部类的构造方法,因此,内部类可以拿程序简单和简洁。
3.声明用可见性修饰符声明内部类,遵从应用于一般类成员的可见性规则。
4.可以将内部类声明为static。一个static内部类可以使用外部类的名字访问。一个static类是不能访问外部类的非静态成员的。
5.内部类的对象经常在外部类中创建。但是也可以从另一个类中创建一个内部类的对象。如果该内部是非静态的,就必须先创建一个外部类的实例,然后用下面的语法创建一个内部类的对象:
Java代码
1.OuterClass.InnerClass innerObject = OutObject.new Innerclass()
.如果内部类是静态的,那么使用下面的语法为它创建一个对象:
Java代码
2.OuterClass.InnerClass innerObject = new OutObject.Innerclass()
匿名内部类是一种特殊的内部类,所以有很多方面都应把它当作内部类对待。除此之外,它还不以下特征。
1.匿名内部类必须是扩展父类或实现接口的。但是它不能有明确的extends或implements语句。
2.匿名内部类必须实现父类或接口中所有的抽象方法。
3.匿名内部类总是使用父类的无参数构造方法来创建实例。如果匿名内部类实现了接口,构造方法就是Object().
4.匿名内部类编译为名为OuterClassName$n.class的类。如,如果外部类Test有两个匿名类,那么它们就编译成Test$1.class和Test$2.class。
静态内部类和非静态内部类的区别
1. 嵌套类的对象,并不需要其外围类的对象。 即它可以不依赖于外部类实例被实例化。
2. 不能从嵌套类的对象中访问非静态的外围类对象。 这是由Java语法中"静态方法不能直接访问非静态成员"所限定
3. 外部类访问内部类的的成员有些特别, 不能直接访问, 但可以通过内部类实例来访问, 这是因为静态嵌套内的所有成员和方法默认为静态的了.同时注意, 内部静态类Person只在类StaticTest 范围内可见, 若在其它类中引用或初始化, 均是错误的.
4 . 静态内部类可以有静态成员,而非静态内部类则不能有静态成员。
5. 静态内部类的非静态成员可以访问外部类的静态变量,而不可访问外部类的非静态变量;
6 . 非静态内部类的非静态成员可以访问外部类的非静态变量。
生成一个静态内部类不需要外部类成员:这是静态内部类和成员内部类的区别。静态内部类的对象可以直接生成
:Outer.I
nner in = new Outer.Inner();而不需要通过生成外部类对象来生成。这样实际上使静态内部类成为了一个顶级类(正常情况下,你不能在接口内部放置任何代码,但嵌套类可以作为接口的一部分,因为它是static 的。只是将嵌套类置于接口的命名空间内,这并不违反接口的规则)