Java编程思想 第2-10章

来源:互联网 发布:免费字体下载软件 编辑:程序博客网 时间:2024/06/06 03:34
  1. 前言
  2. 对象讨论
  3. 一切都是对象
    1. 高精度数字
      1. Biginteger:支持任意精度的整数
      2. BigDecimal:支持任何精度的定点数  
  4. 操作符
    1. Random:创建Random对象时提供种子(用于随机数生成器的初始化,随机数生成器对于特定的种子值总是产生相同的随机数序列)
    2. Math.random():产生0和1之间,包括0,不包括1的一个double值。
    3. 如果将continue语句用于java的for循环,就可以跳到for循环的“更新“部分
  5. 初始化与清理
    1. 垃圾回收器
      1. 自适应的垃圾回收技术,包含两种做法
        1. 停止-复制
        2. 标记-清扫
    2. finalize():一旦垃圾回收器准备好释放对象占用的存储空间,将首先调用其finalize()方法,并且在下一次垃圾回收动作发生时候,才会真正回收对象占用的内存。
      1. 它不是通用的清理方法,真正用途——垃圾回收只与内存有关。它只用在通过某种创建对象方式以外的方式为对象分配了存储空间,即在采用了类似C语言中的做法来分配内存
    3. 成员初始化——java尽力保证:所有变量在使用前都能得到恰当的初始化
      1. 方法的局部变量,java以编译时错误的形式来贯彻这种保证
      2. 类的每个基本类型数据成员保证都会有一个初始值(boolean为false;引用为null;其他为0;)   
  6. 访问权限控制
  7. 复用类
    1. @Override注解:当你想要覆写某个方法时,可以选择这个注解;它可以防止你在不想重载的时候意外的进行了重载(即,加上该注解后后面的方法一定是覆写,也就是说方法名和参数一定是和基类一致的)=》防止覆写的时候出错
组合和继承的选用:问自己是否需要从新类向上转型,如果需要则选择继承
  1. 子类重写继承的方法,不可用降低方法的访问权限,子类继承父类的访问修饰符要比父类的更大,假如我父类是protected修饰的,其子类只能是protected或者public,绝对不能是friendly或者private,当然使用private就不是继承了。

注:继承中子类抛出的异常必须是父类抛出的异常的子异常,或者子类抛出的异常要比父类抛出的异常要少

    1. 包括继承在内的初始化全过程(P146)
    2. 在A类上运行Java时,第一件事情是试图访问A.main();于是加载器开始启动并找出A类,当对他进行加载的时候:先逐步向上加载(向着基类)类,再向下逐步对static初始化,之后类加载完毕(必要的),对象可以被创建;先对基本类型默认,再调用基类构造器,实例变量按次序初始化,最后构造器其余部分被执行。
  1. 多态
    1. 多态的作用(P148):消除类型之间的耦合关系。它允许将多种类型(从同一基类导出的)视为同一种类型来处理,而同一份代码也就可以毫无差别的运行在这些不同类型之上。
    2. 动态绑定(后期绑定,运行时绑定):Java中除了static方法和final方法(private方法属于final方法)之外,其他所有的方法都是后期绑定
    3. =》编写只与基类打交道的程序代码,并且这些代码对所有的导出类都可以正确运行。
  1. 编写构造器的准则:用尽可能简单的方法使对象进入正常状态;如果可以的话,避免调用其它方法。

注:在构造器内唯一能够安全调用的哪些方法是基类中的final方法(private同样属于final方法)。这些方法不能被覆盖。

  1. 接口
    1. 抽象类:abstract
    2. 接口:interface=》implements
      1. 其中的域都是static final
      2. 方法都是抽象方法和public
  2. 内部类
    1. 作用:将类置于其他类的内部;它了解外部类,并能与之通信;使用内部类写出的方法更加优雅
    2. 从外部类的非静态方法之外的任意位置创建某个内部类对象,必须具体指明这个对象的类型:OuterClassName.InnerClassName
    3. 内部类自动拥有对其外围类的所有成员的访问权
    4. 生成对外部类对象的引用,使用外部类的名字后面紧跟圆点和this:DotThis.this
    5. 直接创建内部类的对象:必须使用外部类的对象来创建该内部类对象:DotThis.Inner dti=dn.new Inner();
    6. 当将内部类向上转型为其基类,尤其是一个接口的时候,所得到的只是指向基类或者接口的引用,能够很方便的隐藏实现的细节。

private内部类给类的设计者提供了一种途径,通过这种方式可以完全阻止任何依赖于类型的编码,并且完全隐藏了实现的细节

    1. 在一个方法里面或者在任意的作用域内定义内部类
      1. 理由:a实现了某类型的接口,于是可以创建并返回对其的引用;b要解决一个复杂的问题,想创建一个类来辅助你的解决方案,但是又不想这个类是公共可用的
      2. 这些内部类在定义的作用域之外不可用,除此之外和普通类一样
    2. 匿名内部类
      1. “;”不要忘记
      2. 如果基类需要一个有参数的构造器,只需简单的传递合适的参数给基类的构造器即可
      3. 定义一个匿名内部类,希望它使用一个在其外部定义的对象,那么编译器要求其参数引用必须是final
      4. 匿名类中不可能有命名构造器(因为它根本没有名字),但通过实例初始化,能够达到为匿名内部类创建一个构造器的效果
    3. 工厂方法

Public static GameFactory factory = new Gameactory(){    public Game getGame(){        return new Chess();     }};

  1. 嵌套类:内部类声明为static
    1. 要创建嵌套类的对象,并不需要其外围类的对象
    2. 不能从嵌套类的对象中访问非静态的外围类对象
    3. 普通的内部类不能有static数据和static字段,也不能包含嵌套类,但是嵌套类可以包含所有这些东西
    4. 接口内部的类是public和static的,只有嵌套类才可以,可以在内部类中实现其外围接口(例如放置测试代码)
    5. 它能透明的访问所有它所嵌入的外围类的所有成员
  1. 使用内部类的原因
    1. 每个内部类都能独立的继承一个(接口的)实现,所以无论外围类是否已经继承了某个(接口的)实现,对于内部类没有影响
    2. 实现多重继承
    3. 闭包(内部类是面向对象的闭包,可以访问外围类的成员)和回调
    4. 控制框架的完整实现是由单个类创建的,从而使实现的细节被封装起来;内部类可以在单一的类里面产生对同一个基类的多种导出版本,而且能够很容易的访问外围类的任意成员
  2. 当继承了某个外围类的时候,内部类并没有发生什么特别的变化,这两个内部类(一个是基类的,一个是子类的)是完全独立的两个实体,各自在自己的命名空间内,除非明确的继承某个内部类
  3. 使用局部内部类而不使用匿名内部类的理由
    1. 如果需要一个已命名的构造器或者需要重载构造器,选择局部内部类,匿名内部类只能用于实例初始化
    2. 需要不止一个该内部类的对象的时候使用局部内部类
1 0