内部类

来源:互联网 发布:浙江大学软件学院硕士 编辑:程序博客网 时间:2024/05/14 08:27

学java时,我们学到内部类时,常常容易搞混几种内部类,下面我们来看看一下,这几种内部类的区别,及特征。

1) 成员内部类

:类的声明与外部类的其它成员(属性、方法……)在外部类的结构上是同等级别的。例如:

public class OutterClass {    private int i;    public void test() {        InnerClass ic = new InnerClass();    }    private class InnerClass {    }}

由于成员内部类是外部类的一部分,所以,在没有创建出外部类的对象之前,不可以创建内部类的对象。
由于成员内部类是外部类的“成员”,所以,可以使用任何访问权限修饰符进行修饰。

2) 静态(成员)内部类

:使用了static进行修饰的成员内部类。

public class OutterClass {    private int i;    public void test() {}    private static class InnerClass {    }}

由于静态成员可以直接加载到内存,所以,可以在不创建外部类的对象时,直接创建静态内部类的对象。
由于静态内部类使用了static修饰符,则在静态内部类中,无法直接访问外部类的非静态成员。

3) 局部内部类

:在方法中编写的内部类。例如:

public class OutterClass {    public void test() {        int i = 100;        class InnerClass {            public int x;            public void run() {}        }    }}

局部内部类不可以使用任何修饰符(public、private、static……),因为这些修饰符是用于修饰类的成员的。
由于局部内部类是声明在方法中的,而方法中的代码区分先后顺序,所以,使用局部内部类,必须在声明局部内部类之后,且,该局部内部类只能作用于所在的方法。
局部内部类不可以直接访问局部变量,如果一定要访问该量,需要将变量修饰为final,或者提升为全局变量。

4) 匿名内部类

:直接new出已知的类的子类对象,或者接口的抽象类对象,例如:

public class MainActivity extends Activity {    private View.OnClickListener listener = new View.OnClickListener {        public void onClick(View view) {        }    };    protected void onCreate(Bundle bundle) {        new View.OnClickListener() {            public void onClick(View view) {            }        };    }}

由于匿名内部类是直接创建出对象的,如果是直接在方法中创建对象,则该匿名内部类符合局部内部类的特征,例如不可以直接访问局部变量等等;

内部类可以访问外部类的所有成员,无论这些成员是使用什么样的权限修饰的。

0 0
原创粉丝点击