java中的内部类汇总

来源:互联网 发布:python gnu readline 编辑:程序博客网 时间:2024/06/16 09:55

内部类是什么:

内部类是定义在另外一个类里面的类,与它相对应的,包含内部类的类是外部类。

为什么要用内部类:

1、内部类提供了更好的封装,把内部类隐藏在外部类之内,不允许同一个包中的其他类访问该类

2、内部类所实现的功能外部类同样可以实现,只是有时使用内部类更方便

内部类数据访问特点:

1、内部类可以直接访问外部类的成员,包括私有成员

2、外部类访问内部类成员时,需要创建对象

内部类的分类:

1、成员内部类(在成员位置定义的类)

2、局部内部类(也叫方法内部类,在局部位置,即方法内定义的类)

3、静态内部类(被static修饰的成员内部类)

4、匿名内部类(没有名字的内部类)

详细内容

一、成员内部类

class Outer {String strO = "OuterString";// 成员内部类protected class Inner {public void show() {System.out.println(strO);}}public void method() {// 访问内部类,内部类相当于一个外部类成员的位置Inner in = new Inner();in.show();}}class InnerClassTest {public static void main(String[] args) {//在其他类中调用Outer类的Inner内部类时的格式。必须使用外部类对象来创建内部类对象,不能直接new一个内部类对象Outer.Inner in=new Outer().new Inner();//外部类.内部类 对象名=外部类对象.new 内部类();in.show();                Outer o=new Outer();//当内部类Inner被private修饰时,需要提供公共方法调用Inner类的成员,再在其他类InnerClassTest中使用                o.method(); }}
        Inner类是Outer类的成员内部类,Inner类可以使用任意访问控制符,如public,protected,默认的,private。在InnerClassTest类中调用Outer类的内部类。当Inner的访问控制符是private时,其他类InnerClassTest中不能调用内部类。Inner类中可以直接访问Outer类中的成员,不受访问控制符的影响。

        编译后,内部类也生成了一个.class 文件,文件名称是外部类名$内部类名.class

        当成员内部类被private修饰后,在InnerClassTest类中将不能创建内部类Inner的对象,这就是private修饰符保证安全性的体现。如果要使用Inner内部类的方法,可以在Outer类中提供一个公共方法例如method(),来调用私有内部类的show方法。

二、局部内部类(方法内部类)

class FOuter {private int num = 123;public void method() {final int num2 = 100;//final修饰的局部变量// 定义一个局部内部类 class Inner {public void show() {System.out.println(num);System.out.println(num2);}}Inner i = new Inner();i.show();}}class FunctionInnerClassTest {public static void main(String[] args) {// 创建外部类对象FOuter o = new FOuter();o.method();}}


        局部内部类是定义在外部类的方法中的类,局部内部类只在该方法的内部可见,即只在该方法内可用。由于局部内部类不能在外部类的方法以外的地方使用,因此,局部内部类不能使用static修饰符和public、protected、private修饰符。

          1、局部内部类访问局部变量必须使用final修饰

          2、局部内部类可以直接访问外部类的成员

三、静态内部类

// 外部类class NOuter {// 外部类中的静态变量num1private static int num1 = 7;private int num2 = 12;// 创建静态内部类public static class SInner {// 内部类中的变量num1int num1 = 24;public void show() {System.out.println("访问外部类中的num1:" + NOuter.num1);System.out.println("访问外部类中的num2:" + new NOuter().num2);System.out.println("访问内部类中的num1:" + num1);}}public void show() {SInner si = new SInner();si.show();}}class StaticInnerClassTest {// 测试静态内部类public static void main(String[] args) {// 直接创建内部类的对象NOuter o = new NOuter();// 调用show方法o.show();                NOuter.SInner oi=new NOuter.SInner();                oi.show(); }}


       静态内部类其实是在成员内部类的基础上被static修饰的内部类。因为内部类是外部类的一个成员,为了方便访问,用static修饰。这种内部类的特点是:

       1、静态内部类随着外部类的加载而加载。

        2、静态内部类不能直接访问外部类的非静态成员,但是可以通过new 外部类().成员的方式访问.

        3、如果外部类的静态成员与内部类的成员名称相同,可通过类名.静态成员访问外部的静态成员,如果名称不同,可直接通过成员名调用外部类静态成员。

        4、在其他类例如测试类StaticInnerClassTest类中,访问格式:外部类名.内部类名 对象名=new 外部类名.内部类名();

四、匿名内部类

 匿名内部类:没有名字的内部类
 前提: 存在一个接口或类 这个类可以使抽象的也可以是具体
      格式:
        new 类名或者接口名(){
            重写方法;
        };//相当于创建一个实现该接口或者继承该类的子类的匿名对象.

 匿名内部类的本质:
       该接口的实现类  匿名   对象


0 0
原创粉丝点击