ThinkingInJava----第10章 内部类

内部类:外部类与内部类的private 元素可以相互访问。内部类看成外部类的一个对象来访问。

方法中创建内部类方法的某个作用域中创建内部类++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++10.6 匿名内部类1.在匿名内部类末尾是分号,是标志表达式的结束,而并不是内部类的结束,恰好表达式的结束。2.在匿名内部类中不可能有,有名的构造器,但是通过实例初始化,能达到为匿名内部类创建构造器的效果。(实例初始化的效果就是构造器而且你不能重载实例初始化方法)3.匿名内部类不能即扩展类又实现接口。(如果实现接口也只能实现一个)++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++10.6.1 再访工厂方法
public class Outer {
    private int i;
    private void g(){
        System.out.println("g()");
    }

    public void f(){
        //匿名内部类
        new Object(){
            private void h(){
                for (;i < 3;i++)
                    System.out.println("i = " + i);
            }
        }.h();
        System.out.println("f()");
    }

    public static void main(String[] args) {
        // 创建匿名内部类的对象并且调用它的方法
        test11_2.Outer outer = new Outer();
        outer.f();
    }
}

public class test.Test {
    public test.SimplyInterface get(){
       return new test13.SimplyInterface(){
            // 不用 implements ,直接把接口的方法写进匿名内部类
            @Override
            public void f() {
                System.out.println("f()");
            }
        };
    }

    public static void main(String[] args) {
        test.Test test = new test13.Test();
        test.get().f();
    }
}

public interface test.SimplyInterface {
    void f();
}
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++10.7 嵌套类(它的类类似与一个static 方法)1.不需要内部类对象与其外围类对象之间又联系,那么可以将内部类声明为static,这样的类常称为嵌套类。2.普通内部类对象隐式的保存一个对外部类的引用,   嵌套类:要创建嵌套类的对象,不需要外围类对象。           不能从嵌套内部类中访问非静态的外围类对象。           普通内部类:其字段与方法,只能放在类外部的层次上,所以普通内部类不能有static数据和static字段,也不能包含嵌套类。           但嵌套类可以包含所有这些东西。

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
public class Test {

    // 注意二者访问方式的不同
    public static void main(String[] args) {
        // 注意编译生成的.class文件的名字
        new Nested1().f();
        new Nested1.Nested2().g();

        Test t = new Test();
        Test.Nested1 nd1 = new Nested1();
        nd1.f();
        Test.Nested1.Nested2 nd2 = new Nested1.Nested2();
        nd2.g();
    }

    // 嵌套类
    static class Nested1{
        static class Nested2{
            void g(){
                System.out.println("Test.Nested1.Nested2.g()");
            }
        }
        void f(){
            System.out.println("Test.Nested1.f()");
        }
    }

    // 普通内部类
    class Inner1{
        class Inner2{
            public void g(){
                System.out.println("Test.Inner.Inner2.g()");
            }
        }
        public Inner2 getInner2(){
            return new Inner2();
        }
        public void f(){
            System.out.println("Test.Inner.f()");
        }
    }
    public Inner1 getInner1(){
        return new Inner1();
    }
}
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++10.7.1 接口内部的类1.正常情况下接口内部是不可以放代码,但嵌套类可以作为借口的一部分,放在接口中的任何类都自动的是public和static的,  因为类是static的,只是将嵌套类置于接口的命名空间内,并不违反接口的规则。  创建某些公共代码,使得他们可以被某个接口的所有不同实现所共用。
  public interface NestedInterface {
       class Nested{
          public void f(){
              System.out.println("NestedInterface.ClassB.f()");
          }
      }
  }
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
public interface I {
    void g();
    void f();
    class Nested{
        static void call(I impl){
            System.out.println("I.g()");
            impl.g();
            System.out.println("I.f()");
            impl.f();
        }
    }
}
public class Test {
    public static void main(String[] args) {
        I impl = new I(){
            public void g(){}
            public void f(){}
        };
    I.Nested.call(impl);
    }
}
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++10.7.2 从多层嵌套类中访问外部类得成员1.一个内部类被嵌套多少层并不重要,只要它能透明的访问所有它所嵌入的外围类的所有成员。++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++10.8 为什么需要内部类1.内部类提供了某种进入外部类的窗口。2.每个内部类都能都能独立的继承一个接口的实现,所以一个外部类是否实现了某个接口,对内部类并无影响。3.内部类实现了“多重继承”4.内部类还可以获得一些其它的特征    1)可以有多个实例,每个实例都有自己的状态信息,并且与外部对象的信息相互独立,    2)单个外部类,可以让多个内部类以不同的方式实现一个接口,或继承同一个类。    3)创建内部类对象的时刻,不依赖外围类对象的创建。    4)内部类就是一个独立的实体,没有is-a关系++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++10.8.1 闭包与回调1.闭包(closure) 是一个可调用的对象,它记录了对象的信息,这些信息源来自于创建它的作用域。  可以看出内部类是面向对象的闭包,因为它不仅包含外围类对象的信息,还自动拥有一个指向一个此外围类对象的引用。 (在此作用域内部类包含所有成员的操作权限包括private)++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++10.8.2 内部类控制框架1.内部类用来解决问题所需的各种action()2.内部类很容易访问外围类的任意成员。++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++10.9 内部类的继承
public class OuterTwo {

    // 报错
    /*class InnerTwo extends OuterOne.InnerOne{
        public InnerTwo(int i) {
            super(i);
        }
    }*/

    class InnerTwo extends OuterOne.InnerOne{
        public InnerTwo(OuterOne oo,int i) {
            oo.super(i);
        }
        public void f(){
            System.out.println("OuterTwo.InnerTwo.f(0");
            super.f();
        }
    }

    public static void main(String[] args) {
        OuterOne oo = new OuterOne();
        OuterTwo ot = new OuterTwo();
        OuterTwo.InnerTwo it = ot.new InnerTwo(oo,47);
        it.f();

    }
}
public class OuterOne {

    class InnerOne{
        private int i = 1;
        public InnerOne(int i){
            System.out.println("OuterOne.InnerOne");
        }
        public void f(){
            System.out.println("Outer.InnerOne.f()");
        }
    }
}
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++10.10 内部类可以被覆盖吗?覆盖内部类就好像是一个外围类的方法,其实并不起什么作用。++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++10.11 局部内部类典型的方式是在一个方法体中创建,局部内部类是不能有访问说明符的,因为它不是外围类的一部分,但它可以访问当前代码块内部的常量以及所有成员。++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++10.12 内部类标识符$,产生的文件都是自动与平台无关。++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++总结什么情况下用接口,什么情况下用内部类
时间: 2024-10-07 05:17:36

ThinkingInJava----第10章 内部类的相关文章

Java编程思想:第10章 内部类

可以将一个类的定义放在另一个类的内部,这就是内部类. 1.可以实现隐藏 2.内部类了解外围类,并能与之通信,很多时候可以写出更加优雅和清晰的代码 10.1创建内部类 public class Outer{ class Inner{ } } 如果想从外部类的"非静态方法之外"的任意位置创建某个内部类对象,那么必须具体指明这个对象的类型:OuterClassName.InnerClassName 10.2链接到外部类 内部类自动拥有对外围类所有成员的访问权,这是如何做到的呢?当外围类对象创

[think in java]第10章 内部类

内部类 定义:将一个类定一个在另一个类的内部定义,就是内部类. 创建内部类 如果想从外部类的非静态方法之外的任意位置创建某个内部类的对象,需要具体的指明:outerClassName.InnerClassName; 链接到外部类 内部类能访问其外围对象的所有成员,不需要任何特殊条件. 使用.this与.new .this用法 如果你需要生成对外部类对象的引用,可以后外部类的名字后面紧跟圆点和this.这一点在编译期就被知晓并受到检查,因此没有任何运行时开销.看下面的例子: public clas

[摘录]第10章 培养胜过对手的力量

第五部分 谈判高手 优势秘籍力量.控制和影响,是每个人与别人交往时都会追求这些东西.不是吗?在进行谈判时,那些最有影响力火灾是最有力量的一方往往会在谈判时迫使对手做出更多的让步.如果你甘心让对手来操纵或影响你的话,显然你就很可能得不到自己想要的结果.另一方面,如果你直到哪些因素,能影响你的对手,并知道如何使用一些具体的方法来形成这种影响力,你就可以将形势控制在自己手中.权力本身也可以成为一种非常富有建设性的力量,当我们谈论权力时,我并不是指独裁者们用来祸害平民们的那种权力,我所说的权力实际上是一

10-11-基数排序-内部排序-第10章-《数据结构》课本源码-严蔚敏吴伟民版

课本源码部分 第10章  内部排序 - 基数排序 ——<数据结构>-严蔚敏.吴伟民版        源码使用说明  链接??? <数据结构-C语言版>(严蔚敏,吴伟民版)课本源码+习题集解析使用说明        课本源码合辑  链接??? <数据结构>课本源码合辑        习题集全解析  链接??? <数据结构题集>习题解析合辑        本源码引入的文件  链接? Status.h.Scanf.c        相关测试数据下载  链接? 数据

读《构建之法》第8、9、10章有感

第8章  需求分析 软件需求 用户的需求五花八门,作为一个软件团队要准确而全面地获取这些需求主要有以下四个步骤: 获取和引导需求.这一步骤也被叫做“需求捕捉”.软件团队需要为用户着想,设身处地,为用户引导出需求. 分析和定义需求.从各个方面获取的需求进行规整,定义需求的内涵从各个角度将需求量化. 验证需求.软件团队要跟利益相关者沟通,通过分析报告.技术原型.用户调查或演示等形式向他们验证软件团队对于这些需求的认知. 在软件产品的生命周期中管理需求. 竞争性需求分析的框架:1.N(需求) 2.A(

敏捷软件开发:原则、模式与实践——第10章 LSP:Liskov替换原则

第10章 LSP:Liskov替换原则    Liskov替换原则:子类型(subtype)必须能够替换掉它们的基类型(base type). 10.1 违反LSP的情形 10.1.1 简单例子 对LSP的违反导致了OCP的违反: struct Point { double x, y;} public enum ShapeType { square, circle }; public class Shape { private ShapeType type; public Shape(Shape

第10章-异常处理 --- 使用throw抛出异常

第10章-异常处理 --- 使用throw抛出异常 (一)抛出异常 如果需要在程序中自行抛出异常,则应使用throw语句,throw语句可以单独使用,throw语句抛出的不是异常类,而是一个异常实例,而且每次只能抛出一个异常实例. throw语句的语法格式如下: throw ExceptionInstance; 如果throw语句抛出的异常是Checked异常,则该throw语句要么处于try块里,显示捕获该异常,要么放在一个带throws声明抛出的方法中,即把该异常交给该方法的调用者处理;如果

第10章-异常处理 --- Checked异常和Runtime异常体系

第10章-异常处理 --- Checked异常和Runtime异常体系 Java的异常被分为两大类:Checked异常和Runtime异常(运行时异常).所有的RuntimeException类及其子类的实例被称为Runtime异常;不是RuntimeException类及其子类的异常实例则被称为Checked异常. 对于Checked异常的处理方法有如下两种: (1)当前方法明确知道如何处理该异常,程序应该用try...catch块来捕获该异常,然后在对应的catch块中修复该异常. (2)当

内部排序-第10章-《数据结构题集》习题解析-严蔚敏吴伟民版

//**留坑待填**// 一.基础知识题 10.1?以关键码序列(503,087,512,061,908,170,897,275,653,426)为例,手工执行以下排序算法,写出每一趟排序结束时的关键码状态: (1)直接插入排序:                            (2)希尔排序(增量d[1]=5): (3)快速排序:                                  (4)堆排序: (5)归并排序:                              

10-12-顺序表地址排序-内部排序-第10章-《数据结构》课本源码-严蔚敏吴伟民版

课本源码部分 第10章  内部排序 - 顺序表地址排序 ——<数据结构>-严蔚敏.吴伟民版        源码使用说明  链接??? <数据结构-C语言版>(严蔚敏,吴伟民版)课本源码+习题集解析使用说明        课本源码合辑  链接??? <数据结构>课本源码合辑        习题集全解析  链接??? <数据结构题集>习题解析合辑        本源码引入的文件  链接? SequenceListType.c        相关测试数据下载  链