1. public class Test {
  2. public static void main(String[] args) {
  3. // Parcel1.test();
  4. // Parcel2.test();
  5. // Sequence.test();
  6. DotThis.test();
  7. }
  8. }
  9.  
  10. class Parcel1 {
  11.  
  12. class Contents {
  13. private int i = 11;
  14.  
  15. public int value() {
  16. return i;
  17. }
  18. }
  19.  
  20. class Destination {
  21. private String label;
  22.  
  23. Destination(String whereTo) {
  24. label = whereTo;
  25. }
  26.  
  27. String readLabel() {
  28. return label;
  29. }
  30. }
  31.  
  32. public void ship(String dest) {
  33. Contents c = new Contents();
  34. Destination d = new Destination(dest);
  35.  
  36. System.out.println(d.readLabel());
  37. }
  38.  
  39. public static void test() {
  40. Parcel1 p = new Parcel1();
  41. p.ship("A");
  42. }
  43.  
  44. }
  45.  
  46. /*
  47. 更典型的情况是:外部类将有一个方法,该方法返回一个指向内部类的引用。
  48.  
  49. 截止到目前,内部类都是有方案被更换的
  50. */
  51. class Parcel2 {
  52. class Contents {
  53. private int i = 11;
  54.  
  55. public int value() {
  56. return i;
  57. }
  58. }
  59.  
  60. class Destination {
  61. private String label;
  62.  
  63. Destination(String whereTo) {
  64. label = whereTo;
  65. }
  66.  
  67. String readLabel() {
  68. return label;
  69. }
  70. }
  71.  
  72. public Destination to(String s) {
  73. return new Destination(s);
  74. }
  75.  
  76. public Contents contents() {
  77. return new Contents();
  78. }
  79.  
  80. public void ship(String dest) {
  81. //上一个实验中,这儿是手动new出来的
  82. Contents c = contents();
  83. Destination d = to(dest);
  84. System.out.println(d.readLabel());
  85. }
  86.  
  87. public static void test() {
  88. Parcel2 p = new Parcel2();
  89. p.ship("B");
  90.  
  91. Parcel2 p2 = new Parcel2();
  92. Parcel2.Destination d = p2.to("C");
  93. Parcel2.Contents c = p2.contents();
  94. }
  95.  
  96. }
  97.  
  98. /*
  99. 当生成一个内部类的对象时,此对象与制造它的外围对象之间就有了一种联系,所以它能访问
  100. 其他外围对象的所有成员,而不需要任何特殊条件。此外,内部类还拥有其外部类的所有元素
  101. 的访问权。
  102.  
  103. 我突然想到了一件事,实现Iterable接口的iterator()方法时,我们就返回的是一个内部
  104. 类。一直不理解这个内部类设计的好处,现在发现自己一直在用它。
  105. */
  106.  
  107. /*
  108. 当某个外部类的对象创建了一个内部类对象时,此内部类对象必定会秘密的捕获一个指向那个
  109. 外部类的引用。内部类对象只能在与其外围类的对象相关联的情况下才能被创建(在内部类是
  110. 非static类时)。
  111. */
  112.  
  113. interface Selector {
  114. boolean end();
  115.  
  116. Object current();
  117.  
  118. void next();
  119. }
  120.  
  121. class Sequence {
  122. private Object[] items;
  123. private int next = 0;
  124.  
  125. public Sequence(int size) {
  126. items = new Object[size];
  127. }
  128.  
  129. public void add(Object x) {
  130. if (next < items.length) {
  131. items[next]=x;
  132. next++;
  133. }
  134. }
  135.  
  136. private class SequenceSelector implements Selector {
  137. private int i = 0;
  138. @Override
  139. public boolean end() {
  140. /*
  141. 书中的逻辑:return i == items.length;
  142. 我觉得不太严谨,又没有说,一定要把items装满,除非你想取到空元素
  143. 我的逻辑:
  144. return i >= next;
  145.  
  146. */
  147. return i >= next;
  148. }
  149.  
  150. @Override
  151. public Object current() {
  152. if (i < next) {
  153. return items[i];
  154. }
  155. return null;
  156. }
  157.  
  158. @Override
  159. public void next() {
  160. i++;
  161. }
  162. }
  163.  
  164. private Selector selector() {
  165. return new SequenceSelector();
  166. }
  167.  
  168. public static void test() {
  169. Sequence sequence = new Sequence(100);
  170. for (int i = 0; i < 10; i++) {
  171. sequence.add(Integer.toString(i));
  172. }
  173.  
  174. Selector selector = sequence.selector();
  175. while (!selector.end()) {
  176. System.out.println(selector.current()+" ");
  177. selector.next();
  178. }
  179. }
  180.  
  181. }
  182.  
  183. /*
  184. 需求:
  185. 如果你在内部类中需要生成对外部类的对象的引用,可以使用外部类的名字后面紧跟圆点和
  186. this。
  187. */
  188. class DotThis {
  189. void f() {
  190. System.out.println("DotThis.f()");
  191. }
  192.  
  193. public class Inner {
  194. public DotThis outer() {
  195. return DotThis.this;
  196. }
  197. }
  198.  
  199. public Inner inner() {
  200. return new Inner();
  201. }
  202.  
  203. public static void test() {
  204. DotThis outter = new DotThis();
  205. DotThis.Inner inner = outter.inner();
  206.  
  207. inner.outer().f();
  208. }
  209.  
  210. }
  211.  
  212. /*
  213. 需求:
  214. 有时,你可能想要告知某些其他对象,去创建某个内部类的对象。要实现这个目的,你必须
  215. 在new表达式中提供对其他外部类对象的引用,这就需要.new语法。
  216.  
  217. ——怎么告知?
  218.  
  219. 我感觉这就是一个,创建内部类对象的语法
  220.  
  221. 想要直接创建内部类的对象,不能去引用外部内的名字,而必须使用外部类的对象来创建该
  222. 内部类的对象,就像在上面的程序中所看到的那样。
  223. */
  224.  
  225. class DotNew {
  226. public class Inner {
  227.  
  228. }
  229.  
  230. public static void test() {
  231. DotNew dn = new DotNew();
  232. /*
  233. 这种编码果然创建不了内部类的对象,编译器报错说:DotNew.this cannot 关联到
  234. 一个静态的上下文。联系上文说的,创建一个内部类时是需要捕捉一个外围内的引用的
  235. 这种方式得不到外围类的引用, 所以无法完成创建。
  236.  
  237. DotNew.Inner di = new DotNew.Inner();
  238. */
  239. DotNew.Inner di = dn.new Inner();
  240. }
  241. }
  242.  
  243. class Parcel3 {
  244. class Contents {
  245. private int i = 11;
  246.  
  247. public int value() {
  248. return i;
  249. }
  250. }
  251.  
  252. class Destination {
  253. private String label;
  254.  
  255. Destination(String whereTo) {
  256. label = whereTo;
  257. }
  258.  
  259. String readLabel() {
  260. return label;
  261. }
  262. }
  263.  
  264. public static void test() {
  265. Parcel3 p = new Parcel3();
  266.  
  267. Parcel3.Contents c = p.new Contents();
  268. Parcel3.Destination d = p.new Destination("D");
  269. }
  270.  
  271. }

Java编程思想:内部类基础部分的更多相关文章

  1. Java编程思想学习(八) 内部类

    可以将一个类的定义放在另一个类的定义内部,这就是内部类. 内部类的定义是简单的,但是它的语法确实很是复杂,让人不是很好理解.下面就内部类做一个小结. 一.内部类的分类 总的来讲内部类分为普通内部类,匿 ...

  2. java编程思想-基础

    interface: 方法默认为public:成员变量默认 static and final 对象数组的定义:理解? 多接口继承:可以多个接口,但只有一个具体类,具体类在前面 自:多接口继承时,来自不 ...

  3. 《java编程思想》--多线程基础--Runnable

    一.简单说下Runnable是什么 1.它是一个接口 2.只提供了run方法 3.这个接口提供了一个协议:实现这个接口的类是active的(不必成为Thread的子类) 4.run方法没有返回值 /* ...

  4. Java编程思想 (1~10)

    [注:此博客旨在从<Java编程思想>这本书的目录结构上来检验自己的Java基础知识,只为笔记之用] 第一章 对象导论 1.万物皆对象2.程序就是对象的集合3.每个对象都是由其它对象所构成 ...

  5. Java编程思想(前十章)

    Java编程思想 有C++编程基础的条件下, 前10章可以快速过一下,都是基本语法,不需要花太多时间. 着重中后段的一些章节,类型信息.泛型.容器.IO.并发等. 中文翻译版 阅读地址 对于一个架构师 ...

  6. 《Java编程思想第四版完整中文高清版.pdf》-笔记

    D.2.1 安插自己的测试代码 插入下述“显式”计时代码,对程序进行评测: long start = System.currentTimeMillis(); // 要计时的运算代码放在这儿 long ...

  7. 《Java编程思想第四版》附录 B 对比 C++和 Java

    <Java编程思想第四版完整中文高清版.pdf>-笔记 附录 B 对比 C++和 Java “作为一名 C++程序员,我们早已掌握了面向对象程序设计的基本概念,而且 Java 的语法无疑是 ...

  8. Java编程思想第四版勘误

    坊间传说这本书翻译得很烂,我倒觉得还好.虽然看原文更准确,但是如果在具备一定编程思维和基础.能够看出来疑问的情况下,还是看中文更快一些,而且这本书本身也不适合初学者看.当然,错误和不通顺还是有的,而且 ...

  9. 《Java编程思想》阅读笔记二

    Java编程思想 这是一个通过对<Java编程思想>(Think in java)进行阅读同时对java内容查漏补缺的系列.一些基础的知识不会被罗列出来,这里只会列出一些程序员经常会忽略或 ...

  10. Java编程思想(第4版) 中文清晰PDF完整版

    Java编程思想(第4版) 中文清晰PDF完整版 [日期:2014-08-11] 来源:Linux社区  作者:Linux [字体:大 中 小]     <Java编程思想>这本书赢得了全 ...

随机推荐

  1. 解决iconv函数无法转换某些中文的问题

    原文: 解决iconv函数无法转换某些中文的问题 请先看以下代码,这个页面是GB2312编码的: $str = '陶喆';echo 'gb2312-'.$str;echo '<br />' ...

  2. C#管理服务停止启动

    由于机器性能问题,把许多服务关闭了,需要用的时候再开启,这样每次都打开服务管理或cmd命令比较麻烦.就自己写了工具显示在桌面上; 声明:ServiceController myController = ...

  3. Qt 5.6 5.8 vs2015 编译静态库版本(有全部的截图)good

    安装Qt 去Qt官网下载Qt安装包  安装Qt和源码,一定要勾选source选项  添加bin到系统变量  工具 需要python3和 perl. vs2015 第三方工具,到官方下载安装  在命令行 ...

  4. Access Violation分成两大类:运行期和设计期(很全的解释)

    用Delphi开发程序时,我们可以把遇到的Access Violation分成两大类:运行期和设计期. 一.设计期的Access Violation 1.硬件原因  在启动或关闭Delphi IDE以 ...

  5. 【图文】[新手]C++ 动态库导出函数名“乱码”及解决

    刚接触C++,在尝试从 dll 中导出函数时,发现导出的函数名都"乱码"了. 导出过程如下: 新建一个Win32项目: 新建的解决方案里有几个导出的示例: // 下列 ifdef ...

  6. python算法与数据结构-循环链表(39)

    一.循环链表的介绍 上一篇我们已经讲过单链表,本篇给大家讲解循单链表的一个变形是单向循环链表,链表中最后一个节点的next域不再为None,而是指向链表的头节点,其基本操作和单链表思路一样. 常用的操 ...

  7. spark streaming 接收kafka消息之四 -- 运行在 worker 上的 receiver

    使用分布式receiver来获取数据使用 WAL 来实现 exactly-once 操作: conf.set("spark.streaming.receiver.writeAheadLog. ...

  8. c++汉诺塔相关知识总结1

    困扰已久,难以攻克的汉诺塔总结来啦 Part One 汉诺塔到底是什么呢? 汉诺塔(Tower of Hanoi)源于印度传说中,大梵天创造世界时造了三根金钢石柱子,其中一根柱子自底向上叠着64片黄金 ...

  9. ThreadLocal使用原理、注意问题、使用场景

    想必很多朋友对ThreadLocal并不陌生,今天我们就来一起探讨下ThreadLocal的使用方法和实现原理.首先,本文先谈一下对ThreadLocal的理解,然后根据ThreadLocal类的源码 ...

  10. 跟我学SpringCloud | 第一篇:介绍

    首先讲一下我为什么要写这一系列的文章,现在网上大量的springcloud相关的文章,使用的springboot和springcloud的版本都相对比较老,很多还是在使用springboot1.x的版 ...