• Java内部类的整理。


    Java 内部类 分四种:成员内部类、局部内部类、静态内部类和匿名内部类。

    成员内部类: (1)即作为外部类的一个成员存在,与外部类的属性、方法并列。 注意:成员内部类中不能定义静态变量,但可以访问外部类的所有成员

    (2) 内部类作为外部类的成员,可以访问外部类的私有成员或属性。(即使将外部类声明为PRIVATE,但是对于处于其内部的内部类还是可见的。)  Out.In in = new Out().new In();

    (3) 用内部类定义在外部类中不可访问的属性。这样就在外部类中实现了比外部类的private还要小的访问权限。 注意:内部类是一个编译时的概念,一旦编译成功,就会成为完全不同的两类。对于一个名为outer的外部类和其内部定义的名为inner的内部类。编译完成后出现outer.classouter$inner.class两类。

    局部内部类: 即在方法中定义的内部类,与局部变量类似,在局部内部类前不加修饰符publicprivate,其范围为定义它的代码块。 注意:局部内部类中不可定义静态变量,可以访问外部类的局部变量(即方法内的变量),但是变量必须是final的。

    注意: 在类外不可直接生成局部内部类(保证局部内部类对外是不可见的)。要想使用局部内部类时需要生成对象,对象调用方法,在方法中才能调用其局部内部类。通过内部类和接口达到一个强制的弱耦合,用局部内部类来实现接口,并在方法中返回接口类型,使局部内部类不可见,屏蔽实现类的可见性。

    静态内部类: 静态内部类定义在类中,任何方法外,用static定义。 注意:静态内部类中可以定义静态或者非静态的成员,静态内部类只能访问外部类的静态成员变量,具有局限性。

    注意:生成(new)一个静态内部类不需要外部类成员:这是静态内部类和成员内部类的区别。静态内部类的对象可以直接生成: Outer.Inner in=new Outer.Inner();而不需要通过生成外部类对象来生成。这样实际上使静态内部类成为了一个顶级类。静态内部类不可用private来进行定义。

    匿名内部类:匿名内部类是一种特殊的局部内部类,它是通过匿名类实现接口。

    匿名内部类的特点: 1.一个类用于继承其他类或是实现接口,并不需要增加额外的方法,只是对继承方法的事先或是覆盖;

    2.只是为了获得一个对象实例,不需要知道其实际类型。;

    3.类名没有意义,也就是不需要使用到;

    只要一个类是抽象的或是一个接口,那么其子类中的方法都可以使用匿名内部类来实现。最常用的情况就是在多线程的实现上,因为要实现多线程必须继承Thread类或是继承Runnable接口。

    在接口上使用内部类

    abstract class Person {

        public abstract void eat();

    }

    public class Demo {

        public static void main(String[] args) {

            Person p = new Person() {

                public void eat() {

                    System.out.println("eat something");

                }

            };

            p.eat();

        }

    }

    Thread类的匿名内部类实现

    public class Demo {

      public static void main(String[] args) {

       Thread t = new Thread() {

         public void run() {

          for (int i = 1; i <= 5; i++) {

            System.out.print(i + " ");

           }

         }

       };

       t.start();

    Runnable类的匿名内部类实现

    public class Demo {

        public static void main(String[] args) {

            Runnable r = new Runnable() {

                public void run() {

                    for (int i = 1; i <= 5; i++) {

                        System.out.print(i + " ");

                    }

                }

            };

            Thread t = new Thread(r);

            t.start();

        }

    }

    内部类总结: 1.首先,把内部类作为外部类的一个特殊的成员来看待,因此它有类成员的封闭等级:private ,protected,默认(friendly),public 它有类成员的修饰符: static,final,abstract

    2.非静态内部类nested inner class,内部类隐含有一个外部类的指针this,因此,它可以访问外部类的一切资源(当然包括private) 外部类访问内部类的成员,先要取得内部类的对象,并且取决于内部类成员的封装等级。 非静态内部类不能包含任何static成员。 

    3.静态内部类:static inner class,不再包含外部类的this指针,并且在外部类装载时初始化. 静态内部类能包含static或非static成员. 静态内部类只能访问外部类static成员. 外部类访问静态内部类的成员,循一般类法规。对于static成员,用类名.成员即可访问,对于非static成员,只能 用对象.成员进行访问

    4.对于方法中的内部类或块中内部类只能访问块中或方法中的final变量。

  • 相关阅读:
    gdb调试
    大数据计算新贵Spark在腾讯雅虎优酷成功应用解析
    推荐系统resys小组线下活动见闻2009-08-22
    从item-base到svd再到rbm,多种Collaborative Filtering(协同过滤算法)从原理到实现
    Nexus设备升级5.0方法
    小议C#错误调试和异常处理
    BMP的图像处理
    一行代码让圆角风雨无阻,告别离屏渲染性能损耗
    推断数组中的反复元素
    HTML5:表格
  • 原文地址:https://www.cnblogs.com/shirandedan/p/5336979.html
Copyright © 2020-2023  润新知