内部类学习笔记

来源:互联网 发布:唐七公子知乎 编辑:程序博客网 时间:2024/05/23 22:52

非静态内部类

非静态内部类对象里保存了一个它寄存的外部类对象引用

  • 存在非静态内部类对象→则一定存在外部类对象
  • 存在外部类对象→不一定存在非静态内部类对象

这里写图片描述

规则:静态成员不能访问非静态成员

这里写图片描述

  • 注①:当外部类属性、内部类属性、内部类方法的局部变量都同名时
  • 注②:不能直接访问,必须显示创建内对象
  • 注③:不能在外部类的静态成员(包括静态方法和静态初始化块)中使用非静态内部类,原因很简单:非静态内部类可看作是外部类的一个实例成员,而静态成员不能访问实例成员。
  • 非静态内部类里不能有静态属性、静态方法、静态初始化块

总之:外部类与非静态内部类的”相互可见性“

  • 非静态内部类可自由访问外部类包括privated成员在内的所有成员,外部类也可通过创建内部类的对象来访问其包括private成员在内的所有成员,所以它们虽然在类层面不是相互可见的,但是从广义上来说具有相互可见性。

代码分析

public class NonStaticInner {    class inner{        public void innermethod(){            System.out.println("innnermethod");             }    }    //外部类的非静态方法访问内部类    public void outermethod(){        new inner().innermethod();        }    /* 外部类的静态方法访问内部类(不能直接访问)     * 因为静态不能访问非静态     * 只能必须先实例化外部类后实例化内部类才能访问     */    public static void main(String[] args) {        // TODO Auto-generated method stub        NonStaticInner test =new NonStaticInner();        test.new inner().innermethod();        //test.outermethod();    }}

静态内部类

在定义静态内部类的时候,是不需要定义绑定在外部类的实例上的。也就是说,要在一个外部类中定义一个静态的内部类,不需要利用关键字new来创建内部类的实例

  • 静态内部类的对象只有外部类的类引用(没有外部类对象的引用)
  • 当静态内部类的对象存在时→外部类对象不一定存在

这里写图片描述

  • 注④:不能够从静态内部类的对象中访问外部类的非静态成员(包括成员变量与成员方法)

代码分析

public class StaticInner {    String mNonString = "非静态成员";    static String mString = "静态成员";    //    static class inner{        int a = 1;        static int b = 2;        static void access(){            System.out.println(mString);            //System.out.println(mNonString);//错误,静态不能访问非静态            System.out.println(new StaticInner().mNonString);        }        void nonaccess(){            System.out.println(mString);            //System.out.println(mNonString);//错误,即使是静态内部类的实例方法,静态也不能访问非静态            System.out.println(new StaticInner().mNonString);        }    }    //外部类的非静态方法访问内部类成员    public void outermethod(){        int c = inner.b;        int d = new inner().a;    }    public static void main(String[] args) {        //外部类的静态方法访问内部类成员        int c = inner.b;        int d  = new inner().a;        //inner.access();        new inner().nonaccess();    }}

两者差别

  • 如是否可以创建静态的成员方法与成员变量(静态内部类可以创建静态的成员,而非静态的内部类不可以)
  • 对于访问外部类的成员的限制(静态内部类只可以访问外部类中的静态成员变量与成员方法,而非静态的内部类即可以访问所有的外部类成员方法与成员变量)

参考:

  • JAVA静态内部类用法
  • Android 关于getView方法中ViewHolder类static修饰符
    理解:①不管ViewHolder是静态内部类还是非静态内部类,都是一样的实例化次数,即可见的item+1次(因为都要new viewholder。)②内部类尽量使用static,是java规范(因为静态内部类不需要寄存外部类的引用this,减小内存开销,降低内存泄漏)③但要注意使用静态内部类的条件是内部类不需要访问外部类
0 0
原创粉丝点击