java 内部类和闭包
内部类(inner class)
public class Outer{
private String name;
class Inner{
public String getOuterName(){
return Outer.this.name;
}
public void setOuterName(String name){
Outer.this.name = name;
}
}
public static void main(String[] args){
Outer outer = new Outer();
Outer.Inner inner = outer.new Inner();
inner.setOuterName("wangtengfei");
System.out.println(inner.getOuterName());
}
}
局部内部类
public class Outer{
private String name;
private String sexual = "male";
class Inner1{
public String getOuterName(){
return Outer.this.name;
}
public void setOuterName(String name){
Outer.this.name = name;
}
}
public void updateName(final String name,final String sexual){
class Inner2{
public void changeOuterInfo(){
Outer.this.name = name;
Outer.this.sexual = sexual;
}
}
Inner2 inner2 = new Inner2();
inner2.changeOuterInfo();
}
public String getSexual(){
return sexual;
}
public static void main(String[] args){
Outer outer = new Outer();
Outer.Inner1 inner = outer.new Inner1();
inner.setOuterName("wangtengfei");
System.out.println("Name:"+inner.getOuterName()+",sexual:"+outer.getSexual());
outer.updateName("Iris","female");
System.out.println("Name:"+inner.getOuterName()+",sexual:"+outer.getSexual());
}
}
静态内部类
public class Outer{
private String name;
private String sexual = "male";
public static int count;
public Outer(){
count++;
}
class Inner1{
public String getOuterName(){
return Outer.this.name;
}
public void setOuterName(String name){
Outer.this.name = name;
}
}
public void updateName(final String name,final String sexual){
class Inner2{
public void changeOuterInfo(){
Outer.this.name = name;
Outer.this.sexual = sexual;
}
}
Inner2 inner2 = new Inner2();
inner2.changeOuterInfo();
}
public String getSexual(){
return sexual;
}
public static class Inner3{
public String getOuterInstanceCount(){
return "there are "+Outer.count+" Outer instances have been created";
}
}
public static void main(String[] args){
Outer outer = new Outer();
Outer.Inner1 inner = outer.new Inner1();
inner.setOuterName("wangtengfei");
System.out.println("Name:"+inner.getOuterName()+",sexual:"+outer.getSexual());
outer.updateName("Iris","female");
System.out.println("Name:"+inner.getOuterName()+",sexual:"+outer.getSexual());
Inner3 inner3 = new Inner3();
System.out.println(inner3.getOuterInstanceCount());
}
}
匿名内部类
public class Outer{
private String name;
private String sexual = "male";
public static int count;
public Outer(){
count++;
}
class Inner1{
public String getOuterName(){
return Outer.this.name;
}
public void setOuterName(String name){
Outer.this.name = name;
}
}
public void updateName(final String name,final String sexual){
class Inner2{
public void changeOuterInfo(){
Outer.this.name = name;
Outer.this.sexual = sexual;
}
}
Inner2 inner2 = new Inner2();
inner2.changeOuterInfo();
}
public String getSexual(){
return sexual;
}
public static class Inner3{
public String getOuterInstanceCount(){
return "there are "+Outer.count+" Outer instances have been created";
}
}
public void showTime(){
Thread t = new Thread(new Runnable() {
public void run() {
int time = 60;
int i = 0;
while(i< time){
System.out.println(Thread.currentThread().toString());
System.out.println((new Date(System.currentTimeMillis())).toString());
i+=5;
try {
Thread.sleep(5*1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
});
ExecutorService executorService = Executors.newCachedThreadPool();
executorService.execute(t);
executorService.execute(t);
}
public static void main(String[] args){
Outer outer = new Outer();
Outer.Inner1 inner = outer.new Inner1();
inner.setOuterName("wangtengfei");
System.out.println("Name:"+inner.getOuterName()+",sexual:"+outer.getSexual());
outer.updateName("Iris","female");
System.out.println("Name:"+inner.getOuterName()+",sexual:"+outer.getSexual());
Inner3 inner3 = new Inner3();
System.out.println(inner3.getOuterInstanceCount());
outer.showTime();
System.out.println("main process end!");
}
}
回调(callbacks)和闭包(closure)
函数式编程中常见的概念,内部作用域中调用定义它的外部作用域中的成员或者方法。示例,在局部内部类Inner2的changeOuterInfo()方法中调用外部Outer类的showTime()方法,注意调用方式(Outer.this.showTime())
public class Outer{
private String name;
private String sexual = "male";
public static int count;
public Outer(){
count++;
}
class Inner1{
public String getOuterName(){
return Outer.this.name;
}
public void setOuterName(String name){
Outer.this.name = name;
}
}
public void updateName(final String name,final String sexual){
class Inner2{
public void changeOuterInfo(){
Outer.this.name = name;
Outer.this.sexual = sexual;
Outer.this.showTime();
}
}
Inner2 inner2 = new Inner2();
inner2.changeOuterInfo();
}
public String getSexual(){
return sexual;
}
public static class Inner3{
public String getOuterInstanceCount(){
return "there are "+Outer.count+" Outer instances have been created";
}
}
public void showTime(){
Thread t = new Thread(new Runnable() {
public void run() {
int time = 60;
int i = 0;
while(i< time){
System.out.println(Thread.currentThread().toString());
System.out.println((new Date(System.currentTimeMillis())).toString());
i+=5;
try {
Thread.sleep(5*1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
});
ExecutorService executorService = Executors.newCachedThreadPool();
executorService.execute(t);
executorService.execute(t);
}
public static void main(String[] args){
Outer outer = new Outer();
Outer.Inner1 inner = outer.new Inner1();
inner.setOuterName("wangtengfei");
System.out.println("Name:"+inner.getOuterName()+",sexual:"+outer.getSexual());
outer.updateName("Iris","female");
System.out.println("Name:"+inner.getOuterName()+",sexual:"+outer.getSexual());
Inner3 inner3 = new Inner3();
System.out.println(inner3.getOuterInstanceCount());
// outer.showTime();
System.out.println("main process end!");
}
}
java 内部类和闭包的更多相关文章
- [转] Java内部类之闭包(closure)与回调(callback)
闭包(closure)是一个可调用的对象,它记录了一些信息,这些信息来自于创建它的作用域.通过这个定义,可以看出内部类是面向对象的闭包,因为它 不仅包含外围类对象(创建内部类的作用域)的信息,还自动拥 ...
- js闭包vs Java内部类
前言: 昨天写了一个关于Java内部的博客,在内部类的最后一点中谈到了Java闭包的概念,他是这样定义闭包的:闭包是一个可调用的对象,它记录了一些信息,这些信息来自创建它的作用域.结合Java的内部类 ...
- Java内部类之间的闭包和回调详解
前言 闭包(closure)是一个可调用的对象,它记录了一些信息,这些信息来自于创建它的作用域.通过这个定义,可以看出内部类是面向对象的闭包,因为它不仅包含外围类对象(创建内部类的作用域)的信息,还自 ...
- Java内部类学习笔记
20160923 定义:将一个类的定义放在另一个类的内部: 从外部类的非静态方法之外,创建某个内部类的对象:OutClassName.InnerClassName: 内部类拥有所有其外部类的成员的访问 ...
- java中的闭包和回调
闭包(Closure)是一种能被调用的对象,它保存了创建它的作用域的信息.JAVA并不能显式地支持闭包,但是在JAVA中,闭包可以通过“接口+内部类”来实现,因为对于非静态内部类而言,它不仅记录了其外 ...
- Java内部类的使用小结
转载:http://android.blog.51cto.com/268543/384844/ Java内部类的使用小结 内部类是指在一个外部类的内部再定义一个类.类名不需要和文件夹相同. *内部类可 ...
- (转载)Java内部类的使用小结
原文摘自:http://android.blog.51cto.com/268543/384844/ 内部类是指在一个外部类的内部再定义一个类.类名不需要和文件夹相同. *内部类可以是静态stati ...
- Java内部类与外部类
错误提示: 没有任何类型 TestThread 的外层实例可访问.必须用类型 TestThread 的外层实例(例如,x.new A(),其中 x 是 TestThread 的实例)来限定分配. pu ...
- 从字节码的角度看Java内部类与外部类的互相访问
Java中non-static内部类为何可以访问外部类的变量?Java中外部类又为何可以访问内部类的private变量?这两个问题困扰过我一段时间,查了一些网上的答案,大多从“闭包”概念入手,理解起来 ...
随机推荐
- 理解js中的运算符优先级
前言 我是有过这样的经历,获取年月日时写出这样的代码: new Date().getFullYear() 此时的我是心虚的,因为我不知道是先执行.运算还是new运算,于是赶紧贴到控制台里,哎呦
- 详解m4文件
最近在分析speex代码,发现编译过程中需要的一个speex.m4文件不知道是何方神圣,怀着对未知知识的渴望,跑到 某哥和某基问了一下,算是认识了,为了方便以后经常见面,这里就做个记录吧. M4实际上 ...
- MVC 中获取Json数据
@{ ViewBag.Title = "json示例项目"; } @Scripts.Render("~/bundles/jquery") <h2>j ...
- python重试(指数退避算法)
本文实现了一个重试的装饰器,并且使用了指数退避算法.指数退避算法实现还是很简单的.先上代码再详细解释. 1.指数退避算法 欠奉.http://hugnew.com/?p=814 2.重试装饰器retr ...
- Linux目录结构详解(一)
Linux目录结构,在逻辑上所有目录只有一个顶点,即/(根目录),是所有目录的起点.根下面类似于一个倒挂着的树的结构. Linux目录按照类别组织: 应用程序 /usr/bin 数据文件,帮助/usr ...
- PE格式第七讲,重定位表
PE格式第七讲,重定位表 作者:IBinary出处:http://www.cnblogs.com/iBinary/版权所有,欢迎保留原文链接进行转载:) 一丶何为重定位(注意,不是重定位表格) 首先, ...
- 张高兴的 Windows 10 IoT 开发笔记:HC-SR04 超声波测距模块
HC-SR04 采用 IO 触发测距.下面介绍一下其在 Windows 10 IoT Core 环境下的用法. 项目运行在 Raspberry Pi 2/3 上,使用 C# 进行编码. 1. 准备 H ...
- [JAVA第二课] java命名规则
Java良好的命名规则以及代码风格可以看出来一个程序员的功底,好多公司也会注重这方面,他们招聘员工在有些时候往往就是根据一个人的代码风格来招人,所以下面就就我知道的代码风格作简要的说明一下.Java命 ...
- Java常用类(四)之数组工具类Arrays
前言 数组的工具类java.util.Arrays 由于数组对象本身并没有什么方法可以供我们调用,但API中提供了一个工具类Arrays供我们使用,从而可以对数据对象进行一些基本的操作. 一.Arra ...
- eclipse项目中引入shiro-freemarker-tags会jar包冲突
maven项目中引入了这个依赖. <dependency> <groupId>net.mingsoft</groupId> <artifactId>sh ...