Java编程思想:内部类基础部分
- public class Test {
- public static void main(String[] args) {
- // Parcel1.test();
- // Parcel2.test();
- // Sequence.test();
- DotThis.test();
- }
- }
- class Parcel1 {
- class Contents {
- private int i = 11;
- public int value() {
- return i;
- }
- }
- class Destination {
- private String label;
- Destination(String whereTo) {
- label = whereTo;
- }
- String readLabel() {
- return label;
- }
- }
- public void ship(String dest) {
- Contents c = new Contents();
- Destination d = new Destination(dest);
- System.out.println(d.readLabel());
- }
- public static void test() {
- Parcel1 p = new Parcel1();
- p.ship("A");
- }
- }
- /*
- 更典型的情况是:外部类将有一个方法,该方法返回一个指向内部类的引用。
- 截止到目前,内部类都是有方案被更换的
- */
- class Parcel2 {
- class Contents {
- private int i = 11;
- public int value() {
- return i;
- }
- }
- class Destination {
- private String label;
- Destination(String whereTo) {
- label = whereTo;
- }
- String readLabel() {
- return label;
- }
- }
- public Destination to(String s) {
- return new Destination(s);
- }
- public Contents contents() {
- return new Contents();
- }
- public void ship(String dest) {
- //上一个实验中,这儿是手动new出来的
- Contents c = contents();
- Destination d = to(dest);
- System.out.println(d.readLabel());
- }
- public static void test() {
- Parcel2 p = new Parcel2();
- p.ship("B");
- Parcel2 p2 = new Parcel2();
- Parcel2.Destination d = p2.to("C");
- Parcel2.Contents c = p2.contents();
- }
- }
- /*
- 当生成一个内部类的对象时,此对象与制造它的外围对象之间就有了一种联系,所以它能访问
- 其他外围对象的所有成员,而不需要任何特殊条件。此外,内部类还拥有其外部类的所有元素
- 的访问权。
- 我突然想到了一件事,实现Iterable接口的iterator()方法时,我们就返回的是一个内部
- 类。一直不理解这个内部类设计的好处,现在发现自己一直在用它。
- */
- /*
- 当某个外部类的对象创建了一个内部类对象时,此内部类对象必定会秘密的捕获一个指向那个
- 外部类的引用。内部类对象只能在与其外围类的对象相关联的情况下才能被创建(在内部类是
- 非static类时)。
- */
- interface Selector {
- boolean end();
- Object current();
- void next();
- }
- class Sequence {
- private Object[] items;
- private int next = 0;
- public Sequence(int size) {
- items = new Object[size];
- }
- public void add(Object x) {
- if (next < items.length) {
- items[next]=x;
- next++;
- }
- }
- private class SequenceSelector implements Selector {
- private int i = 0;
- @Override
- public boolean end() {
- /*
- 书中的逻辑:return i == items.length;
- 我觉得不太严谨,又没有说,一定要把items装满,除非你想取到空元素
- 我的逻辑:
- return i >= next;
- */
- return i >= next;
- }
- @Override
- public Object current() {
- if (i < next) {
- return items[i];
- }
- return null;
- }
- @Override
- public void next() {
- i++;
- }
- }
- private Selector selector() {
- return new SequenceSelector();
- }
- public static void test() {
- Sequence sequence = new Sequence(100);
- for (int i = 0; i < 10; i++) {
- sequence.add(Integer.toString(i));
- }
- Selector selector = sequence.selector();
- while (!selector.end()) {
- System.out.println(selector.current()+" ");
- selector.next();
- }
- }
- }
- /*
- 需求:
- 如果你在内部类中需要生成对外部类的对象的引用,可以使用外部类的名字后面紧跟圆点和
- this。
- */
- class DotThis {
- void f() {
- System.out.println("DotThis.f()");
- }
- public class Inner {
- public DotThis outer() {
- return DotThis.this;
- }
- }
- public Inner inner() {
- return new Inner();
- }
- public static void test() {
- DotThis outter = new DotThis();
- DotThis.Inner inner = outter.inner();
- inner.outer().f();
- }
- }
- /*
- 需求:
- 有时,你可能想要告知某些其他对象,去创建某个内部类的对象。要实现这个目的,你必须
- 在new表达式中提供对其他外部类对象的引用,这就需要.new语法。
- ——怎么告知?
- 我感觉这就是一个,创建内部类对象的语法
- 想要直接创建内部类的对象,不能去引用外部内的名字,而必须使用外部类的对象来创建该
- 内部类的对象,就像在上面的程序中所看到的那样。
- */
- class DotNew {
- public class Inner {
- }
- public static void test() {
- DotNew dn = new DotNew();
- /*
- 这种编码果然创建不了内部类的对象,编译器报错说:DotNew.this cannot 关联到
- 一个静态的上下文。联系上文说的,创建一个内部类时是需要捕捉一个外围内的引用的
- 这种方式得不到外围类的引用, 所以无法完成创建。
- DotNew.Inner di = new DotNew.Inner();
- */
- DotNew.Inner di = dn.new Inner();
- }
- }
- class Parcel3 {
- class Contents {
- private int i = 11;
- public int value() {
- return i;
- }
- }
- class Destination {
- private String label;
- Destination(String whereTo) {
- label = whereTo;
- }
- String readLabel() {
- return label;
- }
- }
- public static void test() {
- Parcel3 p = new Parcel3();
- Parcel3.Contents c = p.new Contents();
- Parcel3.Destination d = p.new Destination("D");
- }
- }
Java编程思想:内部类基础部分的更多相关文章
- Java编程思想学习(八) 内部类
可以将一个类的定义放在另一个类的定义内部,这就是内部类. 内部类的定义是简单的,但是它的语法确实很是复杂,让人不是很好理解.下面就内部类做一个小结. 一.内部类的分类 总的来讲内部类分为普通内部类,匿 ...
- java编程思想-基础
interface: 方法默认为public:成员变量默认 static and final 对象数组的定义:理解? 多接口继承:可以多个接口,但只有一个具体类,具体类在前面 自:多接口继承时,来自不 ...
- 《java编程思想》--多线程基础--Runnable
一.简单说下Runnable是什么 1.它是一个接口 2.只提供了run方法 3.这个接口提供了一个协议:实现这个接口的类是active的(不必成为Thread的子类) 4.run方法没有返回值 /* ...
- Java编程思想 (1~10)
[注:此博客旨在从<Java编程思想>这本书的目录结构上来检验自己的Java基础知识,只为笔记之用] 第一章 对象导论 1.万物皆对象2.程序就是对象的集合3.每个对象都是由其它对象所构成 ...
- Java编程思想(前十章)
Java编程思想 有C++编程基础的条件下, 前10章可以快速过一下,都是基本语法,不需要花太多时间. 着重中后段的一些章节,类型信息.泛型.容器.IO.并发等. 中文翻译版 阅读地址 对于一个架构师 ...
- 《Java编程思想第四版完整中文高清版.pdf》-笔记
D.2.1 安插自己的测试代码 插入下述“显式”计时代码,对程序进行评测: long start = System.currentTimeMillis(); // 要计时的运算代码放在这儿 long ...
- 《Java编程思想第四版》附录 B 对比 C++和 Java
<Java编程思想第四版完整中文高清版.pdf>-笔记 附录 B 对比 C++和 Java “作为一名 C++程序员,我们早已掌握了面向对象程序设计的基本概念,而且 Java 的语法无疑是 ...
- Java编程思想第四版勘误
坊间传说这本书翻译得很烂,我倒觉得还好.虽然看原文更准确,但是如果在具备一定编程思维和基础.能够看出来疑问的情况下,还是看中文更快一些,而且这本书本身也不适合初学者看.当然,错误和不通顺还是有的,而且 ...
- 《Java编程思想》阅读笔记二
Java编程思想 这是一个通过对<Java编程思想>(Think in java)进行阅读同时对java内容查漏补缺的系列.一些基础的知识不会被罗列出来,这里只会列出一些程序员经常会忽略或 ...
- Java编程思想(第4版) 中文清晰PDF完整版
Java编程思想(第4版) 中文清晰PDF完整版 [日期:2014-08-11] 来源:Linux社区 作者:Linux [字体:大 中 小] <Java编程思想>这本书赢得了全 ...
随机推荐
- UWP-ListView到底部自动加载更多数据
原文:UWP-ListView到底部自动加载更多数据 ListView绑定的数据当需要“更多”时自动加载 ListView划到底部后,绑定的ObservableCollection列表数据需要加载的更 ...
- C++ 标准库概览(一分钟就看完了)
C++ 标准库以若干头文件的方式提供. 下面简单介绍一个各头文件的内容. 第一部分 容器 Containers <array> C++11 新增.提供了容器类模板 std::array,固 ...
- wsl相关总结
启用WSL VirtualMachinePlatform是WSL2依赖功能,需要系统支持(build 18917+),硬件支持VM功能并开启,安装完成后要重启计算机. Enable-WindowsOp ...
- Azure 云助手主要功能
实时查询: 实时查询Azure云服务的用量和账单,还可以将重点服务固定在首页“我的监控”页面,方便快速查看. 随时管控: 随时随地对云服务管理和配置(例如,重启.更改虚拟机). 多个账户: 随心切换多 ...
- IdHTTP设置SSL证书,乱码问题也解决了
要跟银行做接口,需要使用delphi来post数据,但对方提供的是https开头的网址,需要使用证书,对方已提供证书了,但是还是调用不成功,使用的是idhttp和TIdSSLIOHandlerSock ...
- VS2008 环境中完美搭建 Qt 4.7.4 静态编译的调试与发布(很不错,有六张插图说明,修改qmake.conf里的MD参数等)good
为什么要在VS2008中使用QT静态编译呢?很简单,因为VS2008编译器编译出来的文件比mingw编译的要几乎小一半. 好了现在我们来做些准备工作,VS2008自然要安装的,然后打上SP1的补丁.然 ...
- 为什么API多用C而不是C++,为什么C++程序大多不使用异常
读Defective C++随笔 不尽知用兵之害者,则不能尽知用兵之利也 ——<孙子兵法> 1.为什么API多用C而不是C++以前就一直很奇怪,为什么API大都用C的方式提供,即使有C++ ...
- 阻止系统自动睡眠的小软件,附C#制作过程(执行SetThreadExecutionState API函数,让系统误判)
因为有时下载东西的时候,不想让电脑自动深入睡眠,所以就开启了离开模式.这样不但不节能环保,而且到真正想要睡眠的时候就是一翻蛋疼. 改过自新,关闭了离开模式,同时无操作30分钟后也会进入睡眠模式.但是在 ...
- UILabel范例实现代码如下
#import "TWO_ViewController.h" #define SCREEN_Width [[UIScreen mainScreen] bounds].siz ...
- Codility--- Distinct
Task description Write a function class Solution { public int solution(int[] A); } that, given a zer ...