一、成员内部类

1.可以把一个内部类看做是一个成员。成员内部类可以无条件访问外部类的所有成员属性和成员方法。

class OutterClass {//外部类private int in = 0;static int inn=4;public OutterClass(int in) {this.in = in;}class InnerClass {     //内部类public void output() {System.out.println(in);System.out.println(inn);}}
}

2.当成员内部类拥有和外部类同名的成员变量或者方法时,默认情况下访问的是成员内部类的成员。如果要访问外部类的同名成员,需要以下面的形式进行访问。

OutterClass(外部类).this.成员

3.外部类访问内部类,必须创建一个成员内部类的对象,再通过指向这个对象的引用来访问。

class OutterClass {private int in = 0;static int inn=4;public OutterClass(int in) {InnerClass inner=new InnerClass(); //创建一个成员内部类的对象this.in=inner.innerNum;  //再通过指向这个对象的引用来访问}class InnerClass {    //内部类public int innerNum=1;public void output() {System.out.println(in);System.out.println(inn);int a=OutterClass.this.inn;}}
}

4.成员内部类是依附于外部类而存在的。也就是说,如果要创建成员内部类的对象,前提是必须存在一个外部类的对象。

创建成员内部类的一般方式为:

public class classa {public static void main(){OutterClass  oc=new OutterClass(3);OutterClass.InnerClass in=oc.new InnerClass();}
}

二、局部内部类

局部内部类就像是方法里面的一个局部变量一样,是不能有public、protected、private以及static修饰的。

class OutterClass{public OutterClass(int in){class InnerClass{int innerNum = 1;}}
}

规则一:局部内部类类似方法的局部变量,所以在类外或者类的其他方法中不能访问这个内部类,但这并不代表局部内部类的实例和定义了它的方法中的局部变量具有相同的生命周期。

规则二:只能在方法内部,类(局部内部类)定义之后使用,不存在外部可见性问题,因此没有访问修饰符。

规则三:不能在局部内部类中使用可变的局部变量。

规则四:可以访问外围类的成员变量。如果是static方法,则只能访问static修饰的成员变量。

规则五:可以使用final 或 abstract修饰。

三、静态内部类

又叫静态嵌套类或嵌套类。是使用static关键字修饰的内部类。

一般形式为

public class Outter {/** 嵌套类,public等四种访问修饰符均可修饰*/public static class Inner {/** 嵌套类内部*/}
}

接口中的形式

public interface OutInterface {/** 嵌套类,在接口中定义的任何类都自动的是public和static的,因此这两个关键字都可以省略*/class Inner {public void print() {System.out.println("print()");}}
}

声明为static的内部类,不需要内部类对象和外部类对象之间的联系,就是说我们可以直接引用outer.inner,即不需要创建外部类,也不需要创建内部类。

public class classa {public static void main(){Outter.Inner in=new Outter.Inner();}
}

规则一:不能从嵌套类中访问外部类的非静态成员。这一点与Java基础语法中对静态非静态语法的相关描述完全一致。

规则二:与普通内部类不同,嵌套类实例化不需要依赖外部类对象,与外部类没有必然联系。

规则三:与普通内部类的区别如下:

  普通内部类只能包含非静态变量、非静态方法、非嵌套类。

  静态嵌套类可以包含静态和非静态变量、静态和非静态方法、静态和普通内部类。

规则四:嵌套类可以定义在接口中,并作为接口的一部分来使用。

实例:

/** 接口*/
public interface OutInterface {void method_1();void method_2();/** 嵌套类*/class Inner {public void print() {System.out.println("print something...");}}
}/** 实现类 */
public class OutInterfaceImpl implements OutInterface {private OutInterface.Inner inner = new Inner();@Overridepublic void method_1() {inner.print();}@Overridepublic void method_2() {inner.print();}public static void main(String[] args) {OutInterface oif = new OutInterfaceImpl();oif.method_1();oif.method_2();}
}

四、匿名内部类

由于匿名内部类不利于代码的重用,因此,一般在确定此内部类只会使用一次时,才会使用匿名内部类。

形式:

public class OutterClass {public Runnable task() {return new Runnable() {@Overridepublic void run() {System.out.println("匿名内部类...");}};}
}

五、闭包和回调

闭包(Closure)是一种能被调用的对象,它保存了创建它的作用域的信息。JAVA并不能显式地支持闭包,但是在JAVA中,闭包可以通过“接口+内部类”来实现。
例如:一个接口程序员和一个基类作家都有一个相同的方法work,相同的方法名,但是其含义完全不同,这时候就需要闭包。

class Writer {//作家基类void work(){};
}
interface programmer{//程序员接口void work();
}

闭包实现代码如下:

public class WriterProgrammer extends Writer {@Overridepublic void work(){//写作
    }public void code(){//写代码
    }class ProgrammerInner implements programmer{@Overridepublic void work(){code();}}
}

在子类中定义了遵循程序员接口规则的内部类,然后使用内部类实现程序员的work()方法回调code()方法,在子类中直接实现父类作家的work()方法。

六、内部类的作用

  • 内部类可以很好的实现隐藏。
    一般的非内部类,是不允许有 private 与protected权限的,但内部类可以
  • 内部类拥有外围类的所有元素的访问权限
  • 可是实现多重继承
  • 可以避免修改接口而实现同一个类中两种同名方法的调用。

参考1:https://www.jianshu.com/p/367b138fe909

参考2:https://blog.csdn.net/u014745069/article/details/80201440

转载于:https://www.cnblogs.com/lixiansheng/p/11299765.html

(十)、java内部类与内部类的闭包和回调相关推荐

  1. Java学习笔记二十:Java中的内部类

    Java中的内部类 一:什么是内部类: (1).什么是内部类呢? 内部类( Inner Class )就是定义在另外一个类里面的类.与之对应,包含内部类的类被称为外部类. (2).那为什么要将一个类定 ...

  2. 内部类(闭包与回调)

    http://jiangzhengjun.iteye.com/blog/658354 动态语言的闭包是一个永恒的话题.闭包在编码过程的方便和快捷使得动态语言的拥护者对它津津乐道,而静态语言特别是Jav ...

  3. Java核心类库——内部类那点事儿

    内部类 ---定义在类的内部的类 为什么需要内部类? 典型的情况是,内部类继承自某个类或实现某个接口,内部类的代码操作创建其的外围类的对象.所以你可以认为内部类提供了某种进入其外围类的窗口. java ...

  4. java 中的内部类学习小记

    什么是内部类 一个类的内部又完整的嵌套另外一个类的结构,被嵌套的类就被称为内部类. 嵌套其它的类的类被就是外部类.内部类是类的五大成员之一. 类的五大成员: 属性.方法.构造器.代码块.内部类. 内部 ...

  5. java 为什么有匿名类_全面了解Java中的内部类和匿名类

    Java内部类(Inner Class),类似的概念在C++里也有,那就是嵌套类(Nested Class),乍看上去内部类似乎有些多余,它的用处对于初学者来说可能并不是那么显著,但是随着对它的深入了 ...

  6. java 函数内部类_java 内部类详解 转

    classOuter {classInner { } } (二) 内部类的访问规则 ​ A:可以直接访问外部类的成员,包括私有 ​ B:外部类要想访问内部类成员,必须创建对象 (三) 内部类的分类 ​ ...

  7. java 内部类_Java——内部类详解

    说起内部类,大家肯定感觉熟悉又陌生,因为一定在很多框架源码中有看到别人使用过,但又感觉自己使用的比较少,今天我就带你具体来看看内部类. 内部类基础 所谓内部类就是在类的内部继续定义其他内部结构类. 在 ...

  8. Java Inner Class 内部类

    内部类  Inner Class 一个内部类可以定义在另一个类里,可以定义在函数里,甚至可以作为一个表达式的一部分. Java中的内部类共分为四种: 静态内部类static inner class ( ...

  9. 8、java中的内部类

    根据类定义时所在的位置不同可以将内部类分为四大类:成员内部类.方法内部类.静态内部类.匿名内部类. 成员内部类 顾名思义成员内部类定义在外部类的成员变量位置,相当于外部类的一个成员.将成员内部类当成当 ...

最新文章

  1. 关于oracle中table函数的使用
  2. Java SE Eclipse中引入第三方jar及class
  3. 论文浅尝 - AAAI2021 | 从历史中学习:利用时间感知拷贝生成网络建模时态知识图谱...
  4. 【LeetCode】剑指 Offer 40. 最小的k个数
  5. python except用法和作用_Python保留字简单释义
  6. 资源 | 我拿到了斯坦福、UCL、CMU、NYU的offer,关于博士申请你需要知道的一切...
  7. 啊D注入工具是一种主要用于SQL的注入工具
  8. 自动化测试,你一定要知道的知识
  9. Word论文参考文献排版
  10. 云计算-平台架构-开源-OpenStack
  11. 寒江独钓windows 内核安全编程学习笔记(双机调试)
  12. [原创]中国大陆民谣盘点4 小柯《小柯》
  13. gromacs ngmx_GROMACS使用教程要点
  14. MPX200 ROM DIY指南[转]
  15. 学习Python后能找什么工作
  16. 刻意练习 Elasticsearch 10000 个小时,鬼知道经历了什么?!
  17. Linux帐号和登录安全
  18. overleaf模板导入后中文无法识别问题解决方案
  19. 社交口才:处理好人际关系的七种谈话技巧
  20. 怎样成为一名优秀的平面设计师

热门文章

  1. 数据库杂谈(六)——数据库管理系统
  2. mysql中char,varchar与text类型的区别和选用
  3. 【STC15库函数上手笔记】6、ADC
  4. Java 基础——数组解析
  5. 求一个正整数是哪几个正整数相加的和,这些数不能相同
  6. uni-app微信小程序uni.getLocation获取位置;authorize scope.userLocation需要在app.json中声明permission;小程序用户拒绝授权后重新授权
  7. linux内核源代码分析----内核基础设施之klist
  8. [css] 你知道什么是动态伪类吗?
  9. “约见”面试官系列之常见面试题之第六十二篇之IE和兼容下写法(建议收藏)
  10. 前端学习(1539):hello world