内部类学习笔记
来源:互联网 发布:唐七公子知乎 编辑:程序博客网 时间: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
- 内部类学习笔记
- 内部类学习笔记
- 内部类学习笔记
- 《内部类》学习笔记
- 内部类学习笔记
- 内部类学习笔记
- 内部类学习笔记
- tij学习笔记 内部类
- java学习笔记-内部类
- JavaSE学习笔记--内部类
- TIJ学习笔记-内部类
- [学习笔记]Java内部类
- Java内部类学习笔记
- java内部类学习笔记
- java内部类学习笔记
- Java学习笔记【内部类】
- 【Java学习笔记】内部类
- java内部类学习笔记
- Hadoop系统的数据隐私加密功能
- PLSQL Cursor For Loop
- chrome54以上版本flash不是最新版本解决方法
- 输入N和P(P为质数),求N! Mod P = ? (Mod 就是求模 %)
- 字符串查找替换
- 内部类学习笔记
- java重写与重载
- [百练1088]滑雪(动态规划)
- Linux cmd常用命令& 实例
- sdnu 1069
- Unit 2-Lecture6: Directed Acyclic Graphs & Scheduling
- NYOJ64 - 鸡兔同笼
- 生成对抗网络 - Adversarial Examples 对抗样本
- 1025. PAT Ranking (25)