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");
    }

}

原文地址:https://www.cnblogs.com/junjie2019/p/10544225.html

时间: 2024-10-10 20:39:03

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

Java编程思想(1) - 基础知识

对于Set 和 List都是 接口 Collection 的子接口 1.Set 不允许重复,List允许重复 2.Set 没有顺序,List有顺序 另外:对于List当中,有没有重复元素的判断:是依据元素的 equals方法判断是否相等的. 对于排序来说,是根据元素实现了Comparable接口compareTo()方法来排序的.

java编程思想-基础

interface: 方法默认为public:成员变量默认 static and final 对象数组的定义:理解? 多接口继承:可以多个接口,但只有一个具体类,具体类在前面 自:多接口继承时,来自不同接口的同名方法怎么处理呢? java重载不能依靠返回类型加以区分(C++可以),也不能依靠checked 异常类型区分 变量定义中的系列定义(逗号隔开):变量名 = 值,其它公共 自:类中,自己引用自己的理解(如,链表节点元素).静态看成动态,编译器的本质实现 内部类和普通类区别:内部类可priv

【Java编程思想】10.内部类

将一个类的定义放在另一个类的定义内部,这就是内部类. 10.1 创建内部类 内部类的名字是嵌套在外部类里面的 外部类可以有方法,返回一个指向内部类的调用.(外部类中可以调用内部类) 如果在外部类中,希望能在除了静态方法之外的任意位置创建某个内部类对象,那么可以向下面这样指明对象类型. OuterClassName.InnerClassName x = new InnerClassName(); 10.2 链接到外部类 在创建了一个内部类的对象后,内部类与制造它的外围对象(enclosing ob

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

一.简单说下Runnable是什么 1.它是一个接口 2.只提供了run方法 3.这个接口提供了一个协议:实现这个接口的类是active的(不必成为Thread的子类) 1 /** 2 * The <code>Runnable</code> interface should be implemented by any 3 * class whose instances are intended to be executed by a thread. The 4 * class mu

《Java编程思想(第4版)》pdf

下载地址:网盘下载 内容简介 编辑 本书赢得了全球程序员的广泛赞誉,即使是最晦涩的概念,在Bruce Eckel的文字亲和力和小而直接的编程示例面前也会化解于无形.从Java的基础语法到最高级特性(深入的面向对象概念.多线程.自动项目构建.单元测试和调试等),本书都能逐步指导你轻松掌握.[1] 从本书获得的各项大奖以及来自世界各地的读者评论中,不难看出这是一本经典之作.本书的作者拥有多年教学经验,对C.C++以及Java语言都有独到.深入的见解,以通俗易懂及小而直接的示例解释了一个个晦涩抽象的概

JAVA编程规则【转自java编程思想】

本附录包含了大量有用的建议,帮助大家进行低级程序设计,并提供了代码编写的一般性指导: (1) 类名首字母应该大写.字段.方法以及对象(句柄)的首字母应小写.对于所有标识符,其中包含的所有单词都应紧靠在一起,而且大写中间单词的首字母.例如:ThisIsAClassNamethisIsMethodOrFieldName若在定义中出现了常数初始化字符,则大写static final基本类型标识符中的所有字母.这样便可标志出它们属于编译期的常数.Java包(Package)属于一种特殊情况:它们全都是小

78.JAVA编程思想——改进设计

78.JAVA编程思想--改进设计 <Design Patterns>书内所有方案的组织都围绕"程序进化时会发生什么变化"这个问题展开.对于任何设计来说,这都可能是最重要的一个问题.若根据对这个问题的回答来构造自己的系统,就可以得到两个方面的结果:系统不仅更易维护(而且更廉价),而且能产生一些能够重复使用的对象,进而使其他相关系统的构造也变得更廉价.这正是面向对象程序设计的优势所在,但这一优势并不是自动体现出来的.它要求对我们对需要解决的问题有全面而且深入的理解.在这一节中

81.JAVA编程思想——JAVA编程规则

81.JAVA编程思想--JAVA编程规则 (1) 类名首字母应该大写.字段.方法以及对象(句柄)的首字母应小写.对于所有标识符,其中包含的所有单词都应紧靠在一起,而且大写中间单词的首字母.例如: ThisIsAClassName thisIsMethodOrFieldName 若在定义中出现了常数初始化字符,则大写static final 基本类型标识符中的所有字母.这样便可标志出它们属于编译期的常数. Java 包(Package)属于一种特殊情况:它们全都是小写字母,即便中间的单词亦是如此

关于阅读java编程思想和effective java的一些看法

个人认为,java编程思想并不适合当作新手入门书籍来看,它更多是像给已经使用过java的人群对于基础的一些查缺补漏,有点像一本大部头的工具书,目前该书已看至第十章 -- 内部类, 而effective java这本书,更多是如所说的,是一本分享经验与指引你避免走弯路的经典著作,针对如何编写高效.设计优良的程序提出了最实用.最权威的指导方针,目前该书只看至第三章.我本来是想看完一个章节来写一个读书笔记,但目前来看,这样不合适,都是经典书籍,好书就该多读几次,所以第一遍初读只是大概了解书籍所讲的内容

Java编程思想(第4版)pdf高清版免费下载

下载地址:网盘下载 备用地址:网盘下载 内容简介编辑本书赢得了全球程序员的广泛赞誉,即使是最晦涩的概念,在Bruce Eckel的文字亲和力和小而直接的编程示例面前也会化解于无形.从Java的基础语法到最高级特性(深入的面向对象概念.多线程.自动项目构建.单元测试和调试等),本书都能逐步指导你轻松掌握.[1] 从本书获得的各项大奖以及来自世界各地的读者评论中,不难看出这是一本经典之作.本书的作者拥有多年教学经验,对C.C++以及Java语言都有独到.深入的见解,以通俗易懂及小而直接的示例解释了一