Java 内部类和闭包
来源:互联网 发布:list是集合还是数组 编辑:程序博客网 时间:2024/06/04 19:04
内部类(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!"); }}
阅读全文
0 0
- Java 内部类和闭包
- Java -- 内部类, 成员内部类,局部内部类,匿名内部类,闭包和回调, 枚举类
- JAVA内部类&闭包
- 内部类和闭包
- Java 编程思想(二)内部类和闭包
- Java语法糖系列五:内部类和闭包
- java通过内部类实现闭包
- Java基础---包.内部类
- java 内部类 和 匿名内部类
- java 内部类和匿名内部类
- java内部类和匿名内部类
- java 内部类和匿名内部类
- java 内部类和匿名内部类
- java内部类和静态内部类
- Java内部类和匿名内部类
- Java 内部类(成员内部类、局部内部类、静态内部类和匿名内部类)
- Java内部类提供的闭包功能
- Java学习:内部类,闭包与回调
- codewar
- java中常量池的特点
- JAVA多线程(三)
- JProfiler学习笔记
- 汽车加油问题(贪心算法)
- Java 内部类和闭包
- 【机器学习笔记】logistic回归
- 为什么要用单例模式而不是静态方法
- 十大最佳 Linux 服务器发行版
- XML技术(四)
- ADV-94-复数归一化
- 最少需要多少台虚拟设备?
- centos 7 上传下载小工具
- Java开发之java加密解密