内部类(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 内部类和闭包的更多相关文章

  1. [转] Java内部类之闭包(closure)与回调(callback)

    闭包(closure)是一个可调用的对象,它记录了一些信息,这些信息来自于创建它的作用域.通过这个定义,可以看出内部类是面向对象的闭包,因为它 不仅包含外围类对象(创建内部类的作用域)的信息,还自动拥 ...

  2. js闭包vs Java内部类

    前言: 昨天写了一个关于Java内部的博客,在内部类的最后一点中谈到了Java闭包的概念,他是这样定义闭包的:闭包是一个可调用的对象,它记录了一些信息,这些信息来自创建它的作用域.结合Java的内部类 ...

  3. Java内部类之间的闭包和回调详解

    前言 闭包(closure)是一个可调用的对象,它记录了一些信息,这些信息来自于创建它的作用域.通过这个定义,可以看出内部类是面向对象的闭包,因为它不仅包含外围类对象(创建内部类的作用域)的信息,还自 ...

  4. Java内部类学习笔记

    20160923 定义:将一个类的定义放在另一个类的内部: 从外部类的非静态方法之外,创建某个内部类的对象:OutClassName.InnerClassName: 内部类拥有所有其外部类的成员的访问 ...

  5. java中的闭包和回调

    闭包(Closure)是一种能被调用的对象,它保存了创建它的作用域的信息.JAVA并不能显式地支持闭包,但是在JAVA中,闭包可以通过“接口+内部类”来实现,因为对于非静态内部类而言,它不仅记录了其外 ...

  6. Java内部类的使用小结

    转载:http://android.blog.51cto.com/268543/384844/ Java内部类的使用小结 内部类是指在一个外部类的内部再定义一个类.类名不需要和文件夹相同. *内部类可 ...

  7. (转载)Java内部类的使用小结

    原文摘自:http://android.blog.51cto.com/268543/384844/   内部类是指在一个外部类的内部再定义一个类.类名不需要和文件夹相同. *内部类可以是静态stati ...

  8. Java内部类与外部类

    错误提示: 没有任何类型 TestThread 的外层实例可访问.必须用类型 TestThread 的外层实例(例如,x.new A(),其中 x 是 TestThread 的实例)来限定分配. pu ...

  9. 从字节码的角度看Java内部类与外部类的互相访问

    Java中non-static内部类为何可以访问外部类的变量?Java中外部类又为何可以访问内部类的private变量?这两个问题困扰过我一段时间,查了一些网上的答案,大多从“闭包”概念入手,理解起来 ...

随机推荐

  1. 关于Struts与Ajax整合时的异常处理

     关于Struts与Ajax整合时的异常处理问题: 问题还原: 从而当有异常发出时,会将异常信息发送到页面上.如下图所示:这是一个比较经典的过程: 错误提示页面: 由于sendError()方法里 ...

  2. c# datetime与 timeStamp(unix时间戳) 互相转换

    /// <summary> /// Unix时间戳转为C#格式时间 /// </summary> /// <param name="timeStamp" ...

  3. Dapper数据库相关操作

    using System; using System.Data; using System.Configuration; using System.Data.SqlClient; namespace ...

  4. dotweb框架之旅 [一] - HelloWorld

    一直想着,要系统性的写一些dotweb使用的文章,之前拖延了不少时间,今天,下定决定,算是正式的开始,也请大家一起监督. dotweb,是一款追求简约大方的go web框架,正如其github项目主页 ...

  5. 初识Hibernate之继承映射

         前面的两篇文章中,我们介绍了两张表之间的各种相互关联映射关系,但往往我们也会遇到两张表甚至多张表之间共有着多个相同的字段.例如: 如图,student表和teacher表共同具有id,nam ...

  6. sql server 2008 18456错误

    来自:http://blog.csdn.net/qishuangquan/article/details/6024767 百度搜18456错误几乎只能搜到一篇文章,并不是说结果条数,而是所有的文章都是 ...

  7. day38(增强类的实现)

    定义一个接口 package com.baidu.test; public interface Person { public abstract void eat(); public abstract ...

  8. sys.argv向脚本中传递参数

    可以向脚本中传递无限多个参数,其值是一个列表,默认sys.argv[0]内容是脚本文件路径加文件名 test.py文件中的内容如下: #! /usr/bin/python3import sys pri ...

  9. LeetCode 167. Two Sum II - Input array is sorted (两数之和之二 - 输入的是有序数组)

    Given an array of integers that is already sorted in ascending order, find two numbers such that the ...

  10. 使用element ui 日期选择器获取值后的格式问题

    一般情况下,我们需要给后台的时间格式是: "yyyy-MM-dd" 但是使用Element ui日期选择器获取的值是这样的: Fri Sep :: GMT+ (中国标准时间) 在官 ...