在类内部定义的类称为内部类;
当创建了内部类对象时,他就会与创造他的外围类有了某种联系,也就是可以直接访问外围类的属性而不需要任何的特殊条件(外围类创建内部类对象时,此内部类对象会秘密的的捕获一个指向外围类的引用,于是就可以通过这个引用来访问外围类的成员)。
内部类得到外围类的引用由两种方式,.this与.new(使用.this后,得到创建该内部类时使用的外围类对象的引用,new则是创建了一个新的引,而且需要注意的是,在创建外围类对象之前,不可能创建内部类的对象(嵌套类除外) ;
方法内部类的创建不能加访问修饰符。 另外,方法内部的类也不是在调用方法时才会创建的,它们一样也被编译了。方法内部类访问方法的内部属性时该属性必须为final类型的。
匿名内部类:匿名类可以创建接口,抽象类,与普通类的对象。创建接口时,必须实现接口中所有方法。如果为匿名内部类传递参数时且该匿名内部类调用到了该参数,则该参数必须为fianl类型。由于匿名内部类是匿名的,自然没有构造器,如果想模仿构造器,可以采用实例初始化({})
- public A getA(){
- return new A(){
- int num = 0;
- String str;
- {
- str = "javaeye";
- System.out.println("hello robbin");
- }
- };
- }
嵌套类:static的内部类就叫做嵌套类
使用嵌套类时有两点需要注意:
a、创建嵌套类对象时,不需要外围类
b、在嵌套类中,不能像普通内部类一样访问外围类的非static成员
套类还有特殊之处,就是嵌套类中可以有static方法,static字段与嵌套类,而普通内部类中不能有这些。
- public class StaticClass {
- private int num;
- private static int sum = 2;
- private static class StaticInnerClass{
- public int getNum(){
- //只能访问sum,不能访问num
- return sum;
- }
- }
- }
- public class Test {
- public static void main(String [] args){
- //可以直接通过new来创建嵌套类对象
- StaticClass.StaticInnerClass inner = new StaticClass.StaticInnerClass();
- inner.getNum();
- }
- }