匿名内部类JAVA

来源:互联网 发布:域名不以封疆 编辑:程序博客网 时间:2024/06/05 06:26
内部类
(1)、内部类仍然是一个独立的类,在编译之后内部类会被编译成独立的.class文件,但是前面冠以外部类的类名和$符号 。
(2)、内部类不能用普通的方式访问。内部类是外部类的一个成员,因此内部类可以自由地访问外部类的成员变量,无论是否是private的 。
(3)、内部类声明成静态的,就不能随便的访问外部类的成员变量了,此时内部类只能访问外部类的静态成员变量 。
成员内部类:
package study;    public class AnonymousInterClass {<span style="white-space:pre"></span>public AnonymousInterClass() {<span style="white-space:pre"></span>}<span style="white-space:pre"></span>class OutClass{<span style="white-space:pre"></span>void show(){<span style="white-space:pre"></span>System.out.println("This is a OutClass!");<span style="white-space:pre"></span>}<span style="white-space:pre"></span>}<span style="white-space:pre"></span><span style="white-space:pre"></span>private void show() {<span style="white-space:pre"></span>OutClass outClass = new OutClass(){<span style="white-space:pre"></span>void show(){<span style="white-space:pre"></span>System.out.println("This is a InnerClass!");<span style="white-space:pre"></span>}<span style="white-space:pre"></span>};<span style="white-space:pre"></span>outClass.show();<span style="white-space:pre"></span>}<span style="white-space:pre"></span><span style="white-space:pre"></span>public static void main(String[] args) {<span style="white-space:pre"></span>AnonymousInterClass anonymousInterClass = new AnonymousInterClass();<span style="white-space:pre"></span>anonymousInterClass.show();<span style="white-space:pre"></span><span style="white-space:pre"></span>}}
编译上述代码会产生两个文件:Outer.class和Outer$Inner.class。
方法内部类:
(1)、方法内部类只能在定义该内部类的方法内实例化,不可以在此方法外对其实例化。
(2)、方法内部类对象不能使用该内部类所在方法的非final局部变量。
因为方法的局部变量位于栈上,只存在于该方法的生命期内。当一个方法结束,其栈结构被删除,局部变量成为历史。但是该方法结束之后,在方法内创建的内部类对象可能仍然存在于堆中!例如,如果对它的引用被传递到其他某些代码,并存储在一个成员变量内。正因为不能保证局部变量的存活期和方法内部类对象的一样长,所以内部类对象不能使用它们。
<pre name="code" class="java">package study;public class WayInnerClass {public WayInnerClass() {// TODO Auto-generated constructor stub}public void show() {final int a = 10;class Inner{public void seeOuter() {System.out.println(a);}}Inner inner = new Inner();inner.seeOuter();}public static void main(String[] args) {// TODO Auto-generated method stubWayInnerClass wayInnerClass = new WayInnerClass();wayInnerClass.show();}}

4匿名内部类:

如果满足下面的一些条件,使用匿名内部类是比较合适的:
·只用到类的一个实例 。
·类在定义后马上用到。
·类非常小(SUN推荐是在4行代码以下)
·给类命名并不会导致你的代码更容易被理解。
在使用匿名内部类时,要记住以下几个原则:
·匿名内部类不能有构造方法。
·匿名内部类不能定义任何静态成员、静态方法。
·匿名内部类不能是public,protected,private,static。
·只能创建匿名内部类的一个实例。
·一个匿名内部类一定是在new的后面,用其隐含实现一个接口或实现一个类。
·因匿名内部类为局部内部类,所以局部内部类的所有限制都对其生效。
A、继承式的匿名内部类
package study;public class ExtendsInnerClass {public ExtendsInnerClass() {// TODO Auto-generated constructor stub}public void driving() {System.out.println("This car is driving!");}public static void main(String[] args) {// TODO Auto-generated method stubExtendsInnerClass extendsInnerClass = new ExtendsInnerClass(){public void driving() {System.out.println("This car is another!");}};extendsInnerClass.driving();}}
结果输出了:This car is another! Car引用变量不是引用Car对象,而是Car匿名子类的对象。
B、接口式的匿名内部类。
package study;interface Test{public void driving();}public class InterfaceInnerClass {public InterfaceInnerClass() {// TODO Auto-generated constructor stub}public static void main(String[] args) {// TODO Auto-generated method stubTest test = new Test() {@Overridepublic void driving() {// TODO Auto-generated method stubSystem.out.println("Driving!");}};test.driving();}}

静态嵌套类:
静态内部类中可以定义静态或者非静态的成员。
从技术上讲,静态嵌套类不属于内部类。因为内部类与外部类共享一种特殊关系,更确切地说是对实例的共享关系。而静态嵌套类则没有上述关系。它只是位置在另一个类的内部,因此也被称为顶级嵌套类。
静态的含义是该内部类可以像其他静态成员一样,没有外部类对象时,也能够访问它。静态嵌套类仅能访问外部类的静态成员和方法。
package study;class Outer{static class Inner{public void driving(){System.out.println("static driving!");}}}public class StaticClass {public StaticClass() {// TODO Auto-generated constructor stub}public static void main(String[] args) {// TODO Auto-generated method stubOuter.Inner outer = new Outer.Inner();outer.driving();}}

在静态方法中定义的内部类也是StaticNested Class,这时候不能在类前面加static关键字,静态方法中的StaticNested Class与普通方法中的内部类的应用方式很相似,它除了可以直接访问外部类中的static的成员变量,还可以访问静态方法中的局部变量,但是,该局部变量前必须加final修饰符。

0 0
原创粉丝点击