一、概述

1、内部类有外部类的变量和方法的访问权。

2、使用内部类的一个重要原因是:

每个内部类都能独立的继承自一个类,所以无论外部类是否已经继承自某个类,对于内部类都没有影响。

二、成员内部类

1、没有被static修饰的内部类,可以用权限修饰符、abstract和final修饰。

2、创建内部类对象前需要先创建外部类的对象。new Outer().new Inner()。

3、在外部类中(包括内部类)生成外部类对象的引用。外部类名.this。

4、不能有static修饰的变量和方法。但是可以访问外部类的静态变量和静态方法。

Outer类:

public class Outer {

    public void a()
    {
        Outer.this.b();
        System.out.println("Outer的a()方法");
    }
    
    public void b()
    {
        System.out.println("Outer的b()方法");
    }
    
    class inner
    {
        public Outer getOuter()
        {
            return Outer.this;
        }
    }
}
View Code

Other类:

public class Other
{
    public static void main(String[] args) {
        Outer.inner inner = new Outer().new inner();
        inner.getOuter().a();
    }
}
View Code

三、静态内部类

1、成员内部类用static修饰后就变成静态内部类。

2、可以设置静态和非静态的变量和方法。

3、要创建静态内部类的对象,不需要先创建外部类的对象。

4、静态内部类和静态方法一样,在非静态变量和方法未初始化前就开始初始化,所以不能直接访问外部类的非静态变量和方法,需要先创建外部类的实例后再访问。

四、局部内部类

1、在方法(包括代码块、构造器)中定义的类称为局部内部类。局部内部类的使用范围在定义它的作用域中。所以只能在该作用域中实例化对象。

五、匿名内部类

1、没有名字的内部类。

2、需要继承类或实现接口。

Animal类:

public class Animal
{
    void say(){};
}
View Code

Outer类:

public class Outer {

    public Animal getAnimal()
    {
        return new Animal() {
            @Override
            public void say() {
                System.out.println("猫说话");
            }
        };
    }
}
View Code

通过new返回的引用被自动向上转型成Animal类的引用。简单的理解,一个类继承了Animal类,new出的这个类的实例向上转型成Animal类后再返回。

posted on 2018-01-06 18:38  浮音  阅读(92)  评论(0)    收藏  举报