(十)、java内部类与内部类的闭包和回调

一、成员内部类

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/410264.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vb.net中滚动条一直显示没有数据时也显示_Android Studio 中 System Trace 的新增功能...

Android Studio 中 System Trace 的新增功能在 Android Studio 4.0 中,我们已经对 CPU Profiler 的 UI 做了大量调整来提供更加直观的工作流记录,而在 Android Studio 4.1 中,我们基于开发者们的反馈对此功能进行了持续改进,并且新…

第一节 Memcached分布式缓存入门

关于Memcached的博文太多了,以下是个人学习的收集整理。 本节讨论问题: 简单介绍与应用下载安装注意事项简单测试Memcached分布式原理 一、介绍与应用 在常规的WEB开发下,基本都会利用到缓存用以降低对数据库的压力,提高访问速度。有时候缓存…

tomcat 拦截指定url_一口气说出 过滤器 和 拦截器 6个区别,别再傻傻分不清了

点击“ 程序员内点事 ”关注,选择“ 设置星标 ”坚持学习,好文每日送达!周末有个小伙伴加我微信,向我请教了一个问题:老哥,「过滤器 (Filter) 和 拦截器 (Interceptor) 有啥区别啊?」 听到题目我…

Java 多线程练习---创建两个子线程,每个线程交替输出“你好--来自线程***”...

|--需求说明 |--实现思路 1、创建一个类,实现Runnable,在这个类里面重写run()方法,在run()方法里面写一个20的for循环 2、创建一个类,实例化上面的类,用这个类的对象创建线程 |--代码内容 1 package cn.thread;2 3 /**…

js保留两位小数的函数_使用率低但功能强大的6个Excel函数公式应用技巧解读!...

在Excel函数公式中,有部分函数的使用率是比较低的,但是其功能也是非常强大的。一、Median函数。功能:返回一组数的中值。中值就是一组数的中间数值,如果参数包含的数值是偶数,Median函数将返回位于中间两个值的平均值。…

.net复习之七

表A: 表B: 1. SELECT * FROM A JOIN B ON A.Id B.Id 將顯示 9 條數據。 Inner join(等值连接)只返回两个表中联结字段相等的行 2. SELECT * FROM A LEFT JOIN B ON A.Id B.Id 將顯示 12 條數據…

原生js实现tab栏切换效果

我是歌谣 放弃很容易 但是坚持一定很酷 微信公众号关注小歌谣一起学习前后端知识 运行效果 首先我们来看一下原生js实现的效果 下面就开始直接上代码了 index.html <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"&…

线程八大核心+java并发核心知识体系精讲_Java从业者如果不懂这些,面试80%都会挂在这些核心知识上面...

JVM无论什么级别的Java从业者&#xff0c;JVM都是进阶时必须迈过的坎。不管是工作还是面试中&#xff0c;JVM都是必考题。如果不懂JVM的话&#xff0c;薪酬会非常吃亏(近70%的面试者挂在JVM上了)详细介绍了JVM有关于线程、内存模型、JVM运行时内存、垃圾回收与算法、Java中四种…

Ajax技术简单入门

随着Google公司推出的Gmail服务后,越来越多的人开始关注Ajax技术了,所谓Ajax(Asynchronous JavaScript and XML缩写)技术,就是指运用JavaScript和XML在不用刷新Web页的情况下与Web服务器通信的技术&#xff0e;一般来说&#xff0c;使用Ajax技术主要有两个原因&#xff1a;一是…

Alt Gr or Shift

This is interesting. The keyboard here is different from what we always use in China. Characters and layout are different. Hans gave me the password to logon the system. There s a “” character in it. With Chinese keyboard, I will use “Shift 2″ to gener…

window.addeventlistener 不能调用方法_Java入门第十四课:如何定义”方法“

第十四课&#xff0c;学习定义方法。一个对象包含三种最常见的成员&#xff1a;构造器、Field和方法。Field用于定义状态数据&#xff0c;而方法是行为特征的抽象。那么什么是方法呢&#xff1f;在Java中&#xff0c;方法就是用来完成解决某件事情或实现某个功能的办法。方法实…

深度测试与alpha混合(3)

alpha源混合系数通常设置为D3DBLEND_SRCALPHA&#xff0c;即当前绘制像素的alpha值。目标混合系数设置为D3DBLEND_INVSRCALPHA&#xff0c;即1减去当前绘制像素的alpha值。那么当前绘制像素的alpha值又是如何得到的呢&#xff1f;如果没有使用材质和纹理&#xff0c;当前绘制像…

Effulgent的《深入理解Direct3D9》整理版(转)

深入理解Direct3D9 深入理解D3D9对图形程序员来说意义重大&#xff0c;我把以前的一些学习笔记都汇总起来&#xff0c;希望对朋友们有些所帮助&#xff0c;因为是零散笔记&#xff0c;思路很杂&#xff0c;还请包涵。 其实只要你能完美理解D3DLOCK、D3DUSAGE、D3DPOOL、LOST DE…

我的世界光影mod怎么用_玩转光影!闪光灯、反光板怎么用才高级?

光线对于拍摄的重要性不言而喻&#xff0c;有人甚至说&#xff1a;掌握了光线&#xff0c;你就掌握了摄影。今天我们就来谈谈摄影中和“光”关系最密切的两个器材&#xff1a;闪光灯、反光板。闪光灯的种类之前也跟大家介绍过闪光灯的种类&#xff0c;如果只说较为常用的&#…

正弦定理和余弦定理_那些让你加快解题速度的高中数学公式-26 利用三正弦、三余弦定理快速解题...

作者&#xff1a;本质教育 韦卓甫简单的题目做得又快又对对于任何考试&#xff08;例如高考&#xff09;&#xff0c;本质教育有一条重要的原则&#xff1a;那些考试拿高分的&#xff0c;一定是简单的题目做得又快又对&#xff0c;这样他们才有时间去思考难题。因此&#xff0c…

Centos7静态ip设置(亲测有效)

本文引自&#xff1a;https://www.cnblogs.com/toov5/p/10340395.html&#xff0c;特此鸣谢 最近想测试消息中间件等各类web集群相关技术&#xff0c;这就需要解决linux主机之间互联互通的若干问题&#xff0c;特此折腾 友情提示&#xff1a;在ubuntu19上用vmware15 搭建centos…

认识Web.config文件

Web.config文件是一个XML文本文件&#xff0c;它用来储存 ASP.NET Web 应用程序的配置信息&#xff08;如最常用的设置ASP.NET Web 应用程序的身份验证方式&#xff09;&#xff0c;它可以出现在应用程序的每一个目录中。当你通过VB.NET新建一个Web应用程序后&#xff0c;默认情…

labview在2048中添加时间滚动条_Chrome优化深色模式:滚动条颜色也能跟随变化 使上网更具沉浸感...

为了让谷歌浏览器的深色模式(Dark Mode)变得更加一致&#xff0c;谷歌在 Chrome 的滚动条中添加了对深色模式的支持。虽然我们很多人在上网过程中可能不太关注滚动条&#xff0c;但这毕竟是个可喜的变化&#xff0c;从而让 Chrome 的深色模式更具沉浸感。滚动条并不跟随网页浏览…

rational rose 逆向工程

这一节主要介绍用户如何使用Rose的逆向工程生成UML模型&#xff0c;并用来进行C代码的结构分析。 Rational Rose可以支持标准C和Visual C的模型到代码的转换以及逆向工程。下面将详细地说明这两种C project的逆向工程的步骤和具体操作。 2.1 ANSI C&#xff08;标准C&#xff0…

rabbitmq中默认unack超时时间_RabbitMQ 与 Kafka 的技术差异以及使用注意点

导言作为一个有丰富经验的微服务系统架构师&#xff0c;经常有人问我&#xff0c;“应该选择RabbitMQ还是Kafka&#xff1f;”。基于某些原因&#xff0c; 许多开发者会把这两种技术当做等价的来看待。的确&#xff0c;在一些案例场景下选择RabbitMQ还是Kafka没什么差别&#x…