Java内部类

内部类(inner class)是定义在另一个类中的类,一种编译器现象,与虚拟机无关。
内部类的好处:
    1.隐藏机制:内部类可以对同一个包中的其他类隐藏起来
    2.内部类了解外围类:内部类方法可以访问该类定义所在的作用域中的数据,包括私有的数据
四种内部类:
成员内部类member inner class
静态内部类static inner class (nested class)
局部内部类local inner class
匿名内部类anonymous inner class
------------详细介绍--------------------
1.成员内部类:
可以访问它的外部类的所有成员变量和方法(无论静态、非静态)
自身没有静态成员
外部类里面创建成员内部类的实例:
    this.new Innerclass();
在外部类之外创建内部类的实例:
    new Outerclass().new Innerclass();
在内部类里访问外部类的成员:
    Outerclass.this.member
2.静态内部类(Java面试题中要是说“嵌套类”也是它,估计出题人是C++转的)(没什么实际用处)
使用内部类只是为了把一个类隐藏在另外一个类的内部,并不需要内部类引用外围对象,可以将内部类声明为static,以便取消产生的引用 
只可以访问外部类的静态成员和静态方法,包括了私有的静态成员和方法
生成静态内部类对象的方式为:
 OuterClass.InnerClass inner = new OuterClass.InnerClass();
3.局部内部类
在方法中定义、使用;
不能被public, protected, private和static修饰(像局部变量一样);
只能访问方法中定义的final类型的局部变量(初始化之后便不能更改);
在方法中定义,所以只能在方法中使用。
4.匿名内部类(使用最多)
没有名字的局部内部类;
用于只创建这个类的一个对象的场合(因此不必命名),通常是作为方法的参数;
隐式地继承了一个父类或者实现了一个接口;
限制:由于构造方法的名字与类名相同,而匿名类没有类名,所以,匿名类不能有构造方法;
                                            ----------对比----------------------------
 
自身 外围类
静态成员 非静态成员 静态成员 非静态成员
成员内部类 XXX XXX XXX/OutClass.this.XXX
静态内部类 XXX XXX XXX/OutClass.XXX 不能使用
局部内部类 XXX XXX XXX/OutClass.this.XXX
匿名内部类 XXX XXX XXX/OutClass.this.XXX
可见,静态内部类自成一排,其它三类合同一派。
局部内部类就像成员内部类的作用域缩小版,匿名内部类根本就是局部内部类的简化版;
难怪有个自成是美团的Java面试题说“比较 静态嵌套类 和 内部类 的不同”

你可能感兴趣的:(Java内部类)