内部类(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. (@WhiteTaken)解决Unity5.x下UnityVS2013不能使用的问题

    终于解决了这一困扰我很久的问题. 下面来介绍一下我遇到的问题: 前段时间,重新做了系统,并且安装了Unity5.6版本,VS2013,UnityVS 2013.msi,Visual Studio 20 ...

  2. git-分支使用方式

    需求场景:假如你看着教程完成了一个项目,但是感觉第一次代码掌握不牢,想要进行第二次代码练习--如果某某心里想我还有初始备份文件,我此时的心里独白是你的硬盘还够用吗o(╯□╰)o 1 创建一个新分支 - ...

  3. HDU2874 LCA Tarjan

    不知道为什么_add2不能只用单方向呢...........调试了好多次,待我解决这个狗血问题 #include <iostream> #include <vector> #i ...

  4. webpack 的使用2

    实际项目中的配置 要加__dirname 不然会报错 注意path  /dist 前不要加点 结果 将两个文件打包在一起 结果 传入对象 并且单独打包 name为key 加上本次打包的hash has ...

  5. linux_base_commond_two

    1.linux privilege commond a.throught ll commond  can get follow picture d  directory    -  file   l ...

  6. javaScript基础的基础

    JavaScript是一个脚本语言,需要有宿主文件,他的宿主文件是HTML文件. 与JAVA没有直接关系 一般写在 1.head里面 2.body里面 3.</html>后面 一般写在&l ...

  7. VB改变文件及文件夹属性的函数

    '以下为FSO对象的使用示例(VB6.0) Private myFSO As New FileSystemObject Private myFile As File Private myFolder ...

  8. Ubuntu16.04下Office替代品Office Online

    Ubuntu16.04下Office替代品 Ubuntu16.04下的office Libreoffice 这个是Ubuntu自带的Office,总是存在各种问题,如果用来阅读还是不错的,但是编辑就不 ...

  9. 如何设置App的启动图

    如何设置App的启动图,也就是Launch Image? Step1 1.点击Image.xcassets 进入图片管理,然后右击,弹出"New Launch Image" 2.如 ...

  10. input输入框校验,字母,汉字,数字等

    <!DOCTYPE html><html><head> <meta charset="utf-8"> <meta http-e ...