JAVA第十二弹(内部类和匿名内部类)

来源:互联网 发布:精品美工小刀架 编辑:程序博客网 时间:2024/06/04 18:00

----------------------android培训、java培训、期待与您交流! ----------------------

                                               JAVA第十二弹(内部类和匿名内部类)

                   ——————(个人见解,有错误的地方欢迎批评指正)—————

                                                           (如有雷同纯属巧合)

当描述一个事物时,也许这个事物由很多部分组成,用一个类描述不完整,但是这些部分又是这个事物特有的。这时候就可以用内部类。在一个类内部另外定义一个类就叫内部类。

外部类不能用private定义,但是内部类是可以的,例如:

class Outside {private int i = 3;public void outMethod(){System.out.println("outside:");}class Inside{private int i = 5;public void inMethod(){System.out.println("inside:");}}}


其中InsideOutside的内部类,内部类的访问规则是:①内部类可以直接访问外部类的所有成员,而不需要创建外部类的对象。②外部类访问非静态内部类的所有成员,需要创建内部类的对象。如下:

class Outside {private  int i = 3;public void outMethod(){Inside in = new Inside();in.inMethod();System.out.println("outside:"+in.i);}class Inside{private int i = 5;public void inMethod(){System.out.println("inside:"+Outside.this.i);}}}public class classDemo {public static void main(String[] args) {Outside out = new Outside();out.outMethod();}}


上述程序输出结果为:

inside:3

outside:5

当内部类没被私有化时候,要使用内部类需要先创建外部类的对象,然后通过外部类的对象创建内部类的对象。例如上例的程序,要创建内部类的对象,可以这么写:

Outside.Inside in = new Outside().new Inside();

in.inMethod();

不过,这么设计是多余的,不利于维护。所以内部类应该是属于外部类特有的,用private封装。

内部类可以用static修饰,被static修饰的内部类也叫静态内部类。静态内部类只能访问外部类的static成员,假如尝试访问外部类不是静态的成员,编译器将会报错。当外部类访问静态类中的静态成员时,最好指明是哪个外部类的静态内部类。

外部类.静态内部类.内部类成员或方法;

当内部类存在静态方法或成员时,内部类必须是静态内部类,否则编译器将会报错。

外部类的静态成员只能访问静态内部类。

再看看下面代码:

class Outside {private static int i = 3;public void outMethod(final int i){class Inside{public void inMethod(){System.out.println("inside:"+i);}}new Inside().inMethod();}}


上述程序中,内部类定义在外部类的方法中。当内部类定义在局部中时,内部类不能被static修饰,否则编译将不通过,而且局部区域的内部类要访问局部成员变量时只能是最终类型(final)。而建立该内部类的对象必须要在定义类的后面,否则编译也将不通过。

在写JAVA程序过程中,经常会临时继承某个类或操作某个接口并建立实例的需求。

由于这类子类或接口操作只会使用一次,不需要为这些类定义名称,这时就可以使用匿名内部类来解决这个需求,语法:

new 接口()或父类(){

具体的操作;

};

注意:在写匿名内部类时,要以分号(;)结束。

如下例:

interface Demo{public abstract String getName();}class RealizeDemo{public String getName(String name){return name;}}public class Text{public static void main(String[] args) {String name = "zhangsan";RealizeDemo rd = new RealizeDemo();System.out.println(rd.getName(name));}}


上述代码中,假如RealizeDemo类只需要使用一次,那么这段代码就可以改成:

interface Demo{public abstract String getName();}public class Anonymous {public static void main(String[] args) {final String name = "zhangsan";Demo getName = new Demo(){public String getName(){return name;}};System.out.println(getName.getName());}}


这段代码和上面的代码是一样的效果,这里把之前定义的RealizeDemo类简写了

注意:在匿名内部类中要存取局部变量,则该局部变量必须是final类型的,否则编译将不能通过。看看下例:

public class Anonymous {public static void main(String[] args) {final String name = "zhangsan";Demo getName = new Demo(){public String getName(){return name;}public void doSome(){System.out.println("doSome");}};  getName.doSome();System.out.println(getName.getName());}}


上述代码将不能通过编译,匿名内部类一样遵循多态的特征,在父类或接口多态中中引用子类或实现类中特有的属性会编译失败。

 

----------------------android培训、java培训、期待与您交流! ----------------------

原创粉丝点击