一、简介

因为现在是Android开发实习生。发现在发展过程中越来越多,但他们知道什么时候该使用真实的情况,但没有获得,例如,使用内部类,因此,学习和自己的总结后发现,通过互联网的信息,家分享,如有不当之处。万望指出。

二、内部类

内部类是指在一个外部类的内部再定义一个类,是一个编译时的概念。一旦编译成功,内部类与其外部类就会成为全然不同的两类,仅仅是内部类的前面会冠以外部类的类名和$符号,如一个outer类内部定义了一个inner的内部类,那么编译完毕后会生成outer.class和outer$inner.class两个类,因此内部类的成员变量与方法能够与外部类同样。
从内部类的定义上来看。事实上内部类严重破坏了良好的代码结构。那么为什么还要使用内部类呢?由于内部类能够任意使用外部类的成员变量(包含私有的)而不用生成外部类对象,这也是内部类的唯一长处。

三、内部类的分类及演示样例

内部类分为成员内部类、局部内部类、静态内部类和匿名内部类。以下针对各个内部类进行介绍:

(1)成员内部类

作为外部类的一个成员存在,与外部类的属性、方法并列。成员内部类中能够訪问外部类的全部成员,当外部类的变量与内部类的变量名反复时,使用外部类名.this.变量名能够对外部类的变量进行调用。假设没有反复时可直接使用变量名进行调用。在普通外部类方法中訪问静态内部类可new出成员内部类对象进而直接调用当中的方法,而在静态外部类方法中须要先new出外部类对象,再调用外部类对象名.new 内部类的方式来获得成员内部类对象。

成员内部类中不能定义静态变量,由于成员内部类须要先创建了外部类,才干创建它自己的。

成员内部类能够使用外部类的私有成员和属性。同一时候其在外部类中定义了不可訪问的属性,这样就在外部类中实现了比外部类的private还要小的訪问权限。

演示样例代码例如以下:

/*** * @ClassName: MemberInnerClass* @Description: 成员内部类* @author ADAM* @date 2014年7月25日 上午9:20:28**/
public class MemberInnerClass {private int i = 0;public class Inner {// 成员内部类可加权限修饰符int i = 3;public void print() {System.out.println(i);// 输出为内部类的i。值为3System.out.println(this.i);// 输出为内部类的i,值为3System.out.println(MemberInnerClass.this.i);// 输出外部类的i,值为0}}public void print() {(new Inner()).print();// 外部类普通方法调用成员内部类直接new出内部类进行调用}public static void main(String[] args) {((new MemberInnerClass()).new Inner()).print();// 外部类静态方法中调用成员内部类首先new出外部类然后new出内部类进行调用}
}

(2)局部内部类

即在方法中定义的内部类,与局部变量类似。在局部内部类前不加修饰符public或private。其范围为定义它的代码块。

局部内部类中不可定义静态变量。能够訪问外部类(即方法)中的变量。可是变量必须是final。局部内部类与外部类的命名重名时的调用方法与成员内部类同样,訪问局部内部类必须得先有外部类对象。

在类外不可直接生成局部内部类(保证局部内部类对外是不可见的)。要想使用局部内部类时须要生成外部类对象,对象再去调用方法,在方法中才干调用其局部内部内。

通过内部类与接口达到了一个强制的弱耦合,用局部内部类来实现接口。并在方法中返回接口类型,使局部内部类不可见。屏蔽实现类的可见性。

演示样例代码例如以下:

/*** * @ClassName: LocalInnerClass * @Description: 局部内部类* @author ADAM* @date 2014年7月25日 上午10:36:26 **/
public class LocalInnerClass {private int j = 3;private int i = 2;public void test() {MemberInnerClass memberInnerClass = new MemberInnerClass();
// 若要訪问其它类中的成员内部类仅仅能当该成员内部类的修饰符为public才可
// 否则编译错误,即成员内部类能够再类内部实现比private还要小的权限memberInnerClass.new Inner();final int i = 0;class Inner {// 此处不得加上private等修饰符,否则编译错误int i = 1;public void print() {System.out.println(j);饰符。否则编译错误System.out.println(i);// 此时输出局部内部类的i,外部方法中的变量仅仅能通过传參的形式进行调用System.out.println(LocalInnerClass.this.i);// 此时输出的是外部类中的i}}Inner inner = new Inner();// 局部内部类仅仅能在方法内实例化并进行调用inner.print();}public static void main(String[] args) {(new LocalInnerClass()).test();}
}

局部内部类不仅能够定义在方法中还能够定义在作用域内。下面提供两个Thinking in Java的样例

定义在方法内:

public class Parcel4 { public Destination destination(String s) { class PDestination implements Destination { private String label; private PDestination(String whereTo) { label = whereTo; } public String readLabel() { return label; } } return new PDestination(s); } public static void main(String[] args) { Parcel4 p = new Parcel4(); Destination d = p.destination("Tasmania"); }
} <span style="line-height: 1.3em; font-family: 'Courier New', monospace; background-color: inherit;"> </span>

定义在作用域里:

public class Parcel5 { private void internalTracking(boolean b) { if (b) { class TrackingSlip { private String id; TrackingSlip(String s) { id = s; } String getSlip() { return id; } } TrackingSlip ts = new TrackingSlip("slip"); String s = ts.getSlip(); } } public void track() { internalTracking(true); } public static void main(String[] args) { Parcel5 p = new Parcel5(); p.track(); }
} 

局部内部类也像别的类一样进行编译,仅仅是作用域有所不同。仅仅在该方法或者条件的作用域内才干使用。出了这些作用域则无法被使用。

(3)静态内部类

静态内部类也称为嵌套内部类,定义在类中,不论什么方法外。用static定义,静态内部类中能够定义静态或非静态的成员,其可用public、private等修饰符修饰,一般使用public修饰。方便调用,其仅仅能訪问外部类中的静态成员。外部类訪问静态内部类中的静态成员时直接使用内部类.静态成员,訪问静态内部类的非静态成员时先实例化静态内部类再通过对象訪问。

生成一个静态内部类不须要外部类对象成员。这是与成员内部类的差别,同一时候普通内部类不能有static方法和属性,也不能包括嵌套类,静态内部类的对象能够直接生成:外部类.内部类 对象名= new 外部类.内部类()就可以

注意:当类与接口(或者接口与接口)发生方法命名冲突时,必须使用内部类来实现。

用接口不能全然地实现多继承,用接口配合内部类才干实现真正的多继承。

演示样例代码例如以下:

/*** * @ClassName: StaticInnerClass * @Description: 静态内部类* @author ADAM* @date 2014年7月25日 上午10:37:04 **/
public class StaticInnerClass {private int i = 1;public static int j = 1;public int k = 0;public static class Inner {private int i = 0;private static int j = 0;// 可定义静态与非静态成员public static void print() {
//          System.out.println(k);// 编译错误,不得调用外部类中的非静态成员System.out.println(new StaticInnerClass().i);//訪问外部类中的非静态成员变量须要先实例化外部类System.out.println(j);System.out.println(new StaticInnerClass().j);// 静态内部类使用外部类中的静态成员}}public static void main(String[] args) {Inner.print();// 外部类静态方法或者非静态方法调用静态内部类中的静态成员时直接内部类名.成员就可以StaticInnerClass.Inner inner = new StaticInnerClass.Inner();// 静态内部类的实例化不须要先实例化外部类System.out.println(inner.i);// 訪问静态内部类中的非静态成员时须要先实例化静态内部类}
}

通过内部类实现多继承演示样例代码例如以下:

/*** * @ClassName: Pencil * @Description: 笔类* @author ADAM* @date 2014年7月25日 上午10:42:59 **/
public abstract class Pencil {public abstract void write();
}
/*** * @ClassName: Eraser * @Description: 橡皮擦类* @author ADAM* @date 2014年7月25日 上午10:43:28 **/
public abstract class Eraser {public abstract void erase();
}
/*** * @ClassName: PencilWithEraser * @Description: 多继承类* @author ADAM* @date 2014年7月25日 上午10:43:53 **/
public class PencilWithEraser {private MyPencil pencil = new MyPencil();private MyEraser eraser = new MyEraser();private class MyPencil extends Pencil {//继承笔类@Overridepublic void write() {System.out.println("To Write");}}private class MyEraser extends Eraser {//继承橡皮擦类@Overridepublic void erase() {System.out.println("To Erase");}}// 本类自己的方法。调用继承类中的方法public void write() {pencil.write();}public void erase() {eraser.erase();}public static void main(String[] args) {PencilWithEraser pencilWithEraser = new PencilWithEraser();pencilWithEraser.write();pencilWithEraser.erase();}
}

(4)匿名内部类

  用于继承其它类或是实现接口,并不须要添加额外的方法,仅仅是对继承方法的重写或实现,也使用于仅仅是为了得到一个对象实例,不须要知道事实上际类型,此时类名是没有意义的,也不须要被使用到。

演示样例代码例如以下:

/*** * @ClassName: AnonymousInnerClass * @Description: 匿名内部类* @author ADAM* @date 2014年7月25日 上午10:38:25 **/
public class AnonymousInnerClass {public void click(OnClickListener onClickListener) {System.out.println("click,click");}public static void main(String[] args) {AnonymousInnerClass anonymousInnerClass = new AnonymousInnerClass();anonymousInnerClass.click(new OnClickListener() {// 直接new出匿名内部类,不须要保存对象。一般用于继承其它类或是实现接口@Overridepublic void onClick() {System.out.println("Inner Click");}});}
}

四、总结

因为眼下还是处于学习阶段,对于内部类的使用最多的也是成员内部类和匿名内部类。所以对于诸如非常仔细地去区分各个内部类的使用场景以及涉及到的更小的訪问权限的作用等方面体会并非非常深刻,之后有更进一步的学习会补上,也希望看到这篇博文的朋友假设有一些其它的见解或者补充或者是推荐学习的资料也能够提出来,这篇博文也是借鉴网上各位大神以及百科的相关资料,再自己手动编码验证总结果出,感恩节你大神,谢谢。

版权声明:本文博客原创文章。博客,未经同意,不得转载。

Java 内部类分析相关推荐

  1. java 内部类 作用_java内部类的作用分析

    提起Java内部类(Inner Class)可能很多人不太熟悉,实际上类似的概念在C++里也有,那就是嵌套类(Nested Class),关于这两者的区别与联系,在下文中会有对比.内部类从表面上看,就 ...

  2. java内部类的作用分析

    提起Java内部类(Inner Class)可能很多人不太熟悉,实际上类似的概念在C++里也有,那就是嵌套类(Nested Class),关于这两者的区别与联系,在下文中会有对比.内部类从表面上看,就 ...

  3. java内部类文件,Java内部类学习

    Java内部类学习 1.内部类的实例与外部类的实例共享一种特殊的关系,这种特殊的关系为内部类中的代码提供对封装(外部)类成员的访问.其实,内部类就是外部类的一部分.不仅仅是"一部分" ...

  4. java 内部类定于_搞懂 JAVA 内部类

    前些天写了一篇关于 2018 年奋斗计划的文章,其实做 Android 开发也有一段时间了,文章中所写的内容,也都是在日常开发中遇到各种问题后总结下来需要巩固的基础或者进阶知识.那么本文就从内部类开刀 ...

  5. [转载] 夯实Java基础系列8:深入理解Java内部类及其实现原理

    参考链接: Java内部类 本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tut ...

  6. java内部类规则_Java内部类规则

    Java内部类分为 成员内部类 和 局部内部类 一.成员内部类也即实名内部类 又分为 非静态实名内部类 和 静态实名内部类 1.实名内部类可以看做外部类的成员 , 因而可以具有 private .默认 ...

  7. 注解和反射详细笔记。自定义注解,元注解,内置注解。反射机制,Java Reflection,Java内存分析,反射操作注解,java.lang.reflect.Method,Class

    文章目录 注解 什么是注解 内置注解 元注解 自定义注解 反射机制 静态语言 vs 静态语言 Java Reflection 反射相关的主要API Class类 Java内存分析 创建运行时类的对象 ...

  8. 夯实Java基础系列18:深入理解Java内部类及其实现原理

    本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutorial 喜欢的话麻烦点下 ...

  9. java 堆 分析_Java堆分析 jmap+jhat

    Java堆分析 jmap+jhat 最近在使用DataSync做数据迁移,执行了10天+,进程还未结束,也未出现错误日志,所以就看看是不是哪里卡住了... jmap命令: -dump:[live,]f ...

最新文章

  1. vba oracle 01019,Oracle 客户端连接时报ORA-01019错误总结
  2. LEETCODE- The First Day (C++)
  3. c++opencv汉字分割_机器学习小白,还不快pick一下——【视觉与图像:阈值分割】...
  4. linux 解压tar.jz,linux系统压缩文件和解压缩命令
  5. Linux网络编程--sendfile零拷贝高效率发送文件
  6. AJAX全套(JSONP、CORS)
  7. 因特网几个“特殊”IP地址的专门用途
  8. mysql text转varchar_关于企业面试中:“ Mysql重点 ”的28道面试题解析!
  9. 如何用Java打出a加b_Java 实现 输入 AA 输出 AB ..输入 AZ 输出 BA 一直到输出 ZZ
  10. 鸿蒙什么时候出来,鸿蒙系统什么时候发布
  11. 2019最新 Java商城秒杀系统的设计与实战视频教程(SpringBoot版)_1-1课程整体介绍...
  12. 离散数学 (II) 习题 7
  13. html+css美化后台登录界面
  14. 云课堂让职业院校云计算教学更简单
  15. love2d贪吃蛇---画方格
  16. 架构师?so easy
  17. 正则表达式中问号(?)的用法详解
  18. 微软在盗版黑屏事件可能犯下极大的错误
  19. Python 数据分析微专业课程--项目06 城市餐饮店铺选址分析
  20. 测试用例设计(等价类、边界值、因果图、判定表、正交实验)

热门文章

  1. 我看过的Java方面的好文章
  2. layui时间怎么设置年月日时分秒_layui-laydate时间日历控件使用方法详解
  3. php自动装载编程,php 类自动载入的方法
  4. boot sprint 项目结构_京淘项目03 08.28
  5. nacos项目搭建(服务提供者,服务消费者)
  6. php网站服务器工具,PHP服务器搭建网站常用工具有哪些?
  7. 阿里开源的缓存框架JetCache,实现spring二级缓存
  8. Docker(十四):Docker:网络模式详解
  9. iOS开发网络——数据缓存
  10. python 实现文本搜索_python根据BM25实现文本检索