java中四种静态内部类总结(仅供参考)

来源:互联网 发布:devops正在扼杀程序员 编辑:程序博客网 时间:2024/04/19 23:44
下面通过一个例子来对这四种内部类的使用方法进行总结:
/** * @author zhenglulu * 通过在Test类中定义四种内部类并在main方法中分别进行调用来加深对内部类的理解 */public class Student {private int id = 2010;                     //id默认为2010String name = "student";                   //name默认为studentstatic String schoolName = "湖南大学";      //定义一个面向湖南大学学生的类,所以所有的学生对象共享一个学校名称对象public void setName(String n){name = n;System.out.println("name = " + name);}/* * 普通的内部类(非静态内部类),当然前面可加public,protected,缺省的,private范围修饰符 */class InnerClass{String name = "InnerStudent";public void print(){//因为普通内部类(非静态内部类)默认保存有指向外部类对象的引用,所以可以访问外部类中的任何成员变量及方法System.out.println("schoolName:"+schoolName + ", name:" + name + ", id:" + id);//如果想得到父类中的name,使用Student.this.nameSystem.out.println("parent's name:" + Student.this.name);}}/* * 静态内部类,他跟非静态内部类相比,区别就在于他不保存有指向外部类对象的引用,所以,从狭义上讲,他不是内部类, * 这种类在运行时的行为和功能与普通类没什么区别, */static class StaticClass{String name = "StaticStudent";public void print(){System.out.println("name:" + name);System.out.println("schoolName:" + Student.schoolName);   //只能访问父类中的静态成员}}/* * 局部内部类,他是定义在方法中的类,如果我们在用一个内部类的时候仅需要创建它的一个对象并返回给外部,就可以这样做 */public Student method(){class PartClass extends Student{String name;public PartClass(String name){this.name = name;System.out.println("PartClass's name:" + name);}}return new PartClass("PartStudent");}/* * 匿名内部类,当你只需要创建一个类的对象而且用不上它的名字时,使用匿名内部类可以使代码看上去简洁清楚 */public Student method1(){return new Student(){public void setName(String name){System.out.println("name = " + name);}};}public static void main(String[] args){Student s = new Student();                        //创建一个外部类Student类的对象Student.InnerClass sic = s.new InnerClass();      //得到一个内部类的对象sic.print();                                      //调用InnerClass内部类对象的print方法StaticClass sc = new StaticClass();              //创建一个静态内部类对象sc.print();                                      //调用该静态内部类对象的print方法s.method();                                     //调用Student类中的method方法,得到一个PartClass类的对象//调用Student类中的method1方法,返回一个继承了Student类的对象,并调用它的setName方法s.method1().setName("lulu");                     }}