内部类是指在一个外部类的内部再定义一个类。内部类做为外部类的一个成员,而且依附于外部类而存在的。内部类可为静态,可用protected和private修饰(而外部类只能使用public和缺省的包访问权限)。内部类主要有如下几类:成员内部类、局部内部类、静态内部类、匿名内部类ide
①内部类提供了更好的封装,除了该外围类,同一个包下的其余类都不能访问
②内部类并无使人迷惑的“is-a”关系,他就是一个独立的实体
③内部类能够对同一个包中的其余类隐藏起来,通常的非内部类,是不容许有 private 与protected权限的,但内部类能够
④能够实现多继承
⑤当想要定义一个回调函数且不想编写大量代码时,使用匿名内部类比较便捷函数
①内部类仍然是一个独立的类,在编译以后内部类会被编译成独立的.class文件,可是前面冠之外部类的类名和$符号
②内部类声明成静态的,就不能随便的访问外部类的成员变量了,此时内部类只能访问外部类的静态成员变量
③外部类不能直接访问内部类的的成员,但能够经过内部类对象来访问
④内部类能够自由地访问外部类的成员变量,不管是不是private的
⑤由于当某个外围类的对象建立内部类的对象时,此内部类会捕获一个隐式引用this
class Eat { public void eat() { System.out.println("eat()"); } } class Drink { public void drink() { System.out.println("drink()"); } } public class MutiExtend { private EatExtra eat = null; private DrinkExtra drink = null; MutiExtend() { eat = new EatExtra(); drink = new DrinkExtra(); } public void drink() { drink.drink(); System.out.println("drinkExtra()"); } public void eat() { eat.eat(); System.out.println("eatExtra()"); } private class EatExtra extends Eat { // inner class can not have static declaration // static int age; // allowed,由于在compile阶段就已经肯定了 static final int name = 123; @Override public void eat() { super.eat(); } } private class DrinkExtra extends Drink { @Override public void drink() { super.drink(); } } }
①内部类不能定义静态成员变量和方法
②内部类访问外部类实例用: 外部类名.this.变量名
③建立内部类: outerClassInstane.new InnerClass()code
①不能范围该方法的非final局部变量
②不能够定义静态变量对象
①要建立嵌套类的对象,并不须要其外围类的对象继承
public class AuthModule { // private static int SUCCESS = 200; // private static int FAIL = 400; // 比这种实现要好不少吧,可是只限因而该类的状态,这样能够有命名空间Status private static class Status { private static int SUCCESS = 200; private static int FAIL = 400; } public void doSomething() { System.out.println(Status.SUCCESS); System.out.println(Status.SUCCESS); } }