Java编程思想(前十章)

时间:2024-06-02 17:06:08

Java编程思想

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

  • 对于一个架构师而言,掌握各种语言的优势并可以运用到系统中,由此简化系统的开发,是其架构生涯的第一步.
  • 每一个程序员都不能固步自封,要多接触新的行业,新的技术领域,突破自我.

对象入门

  • 类的继承一般使用'统一标记法'(UML图)来画继承的图.
  • 在面向对象的程序中, 通常要用到上溯造型(向上转型)的技术, 需要动态绑定.
    • Polymorphism(多态性). --- 通过动态绑定实现.
  • Java中使用abstract实现基类的抽象.
  • 复用的具体实现:
    • 组合(composition): 使用现有的类合成新的类. --- has-a的关系.
    • 聚合(aggregation): 动态发生的组合.
  • Java中动态绑定是默认行为, 不需要添加额外的关键字实现多态.
  • 单根继续保证所有对象都具备某些功能.
  • Java的容器库: List用于存储序列, Map关联数组, Set每种对象类型只持有一个.
  • Java中也支持泛型.
  • Java完全采用了动态内存分配方式, 通过new来构建一个对象. 垃圾回收机制可自动发现对象合适不再被使用, 并继而销毁它.
    • 垃圾回收机制提供了更高层的保障, 可以避免暗藏的内存泄漏问题.
    • Java的垃圾回收器被设计用来处理内存释放问题(不包括清理对象的其他方面).
  • Java的并发是内置于语言中的, 具有大量额外的库支持.
  • 超文本标记语言HTML(HyperText Markup Language).

一切都是对象

  • 尽管Java是基于C++的, 但是相比之下, Java是一种更纯粹的面向对象设计语言.

用引用操作对象

  • 一切都被视为对象, 操作的标识符实际上采用的是对象的一个引用(reference).
  • 创建一个引用的同时便进行初始化操作.
  • 通过new操作符(关键字)来实现一个新的对象的创建, 并把它和一个引用进行关联.

  • 五个不同的地方可以进行数据存储:
    • 寄存器: 最快的存储去, 处理器内部.
    • 堆栈: 位于通用RAM(随机访问存储器)中, 堆栈指针下移分配新的内存, 上移释放内存, Java中的对象引用一般都存在堆栈中.
    • 堆: 通用的内存池(也位于RAM区), 用于存放所有的Java对象. 编译器不需要直到堆中对象的生存期.
    • 常量存储: 直接存放在代码内部, 这样做它们永远不会被改变, (ROM)只读存储器.
    • 非RAM存储, 数据完全存活于程序之外, 将不受程序的任何控制, 流对象(将对象转化为字节流)和持久化对象(对象被放在磁盘上).
    • Java内部的基本类型(内置类型)一般不用new来创建, 而是创建一个自动变量, 这个变量直接存储其值, 并置于堆栈中, 这样使用更加高效.
  • Java程序中类型所占空间大小的不变性是它更具有可移植性的原因之一.
    Java编程思想(前十章)
  • Java中自动包装功能可以将基本类型转换为包装器类型, 也可以方向转换.
  • Java提供了两个高进度计算的类: BigInterger(任意精度的整型)和BigDecimal(任意精度的浮点数).
  • Java确保数组会被初始化, 而且不能在它的范围之外被访问, 运行时会检查下标.
    • 数组引用被初始化为null, 数组所占内存被全部置零.

永远不需要销毁对象

  • 作用域, 作用域决定了在其内部定义的变量名的可见性和声明和生命周期.
  • Java是一种*格式(freee-form)的语言, 空格, 制表符, 换行都不会影响程序的执行结果.
  • 方法, 参数和返回值: Java中的方法只能作为类的一部分来创建, 方法只有通过对象才能被调用.
  • 名字可见性. 运用其他构件import Java.util.*.
    • static关键字: 为某种特定域分配单一存储空间, 不考虑究竟要创建多少对象, 甚至根本不创建对象.
      • 希望某个方法不与包含它的类的任何对象关联在一起, 即使没有创建对象也可以使用这个方法.
  • Java的命名风格中, 类名的首字母要大写, 不用下划线分割, 驼峰代码风格, 标识符的第一个字母采用小写.

操作符

  • Java中更简单的打印语句: System.out.println("Rather a lot to type");.
  • 静态导入(static import)可以创建一个小类库来简化打印语句的编写.
  • 直接常量: 在后缀字符标志其类型, L(l)代表long, F(f)代表float, D(d)代表double. 指数记数法(1.39e-43f).
  • Java中类型转换是一种比较安全的操作, 截尾和舍入.

控制执行流程

  • if-else, while, do-while, for, return, break, switch.
  • Java并不支持goto语句.

访问权限控制

  • 如何把变动的事物与保持不变的事物区分开来.
  • public, protected, 包访问权限(没有关键词)和private.
  • Java的标准发布中有一个工具库, 它被组织在java.util名字空间之下.

包:库单元

  • 当编译一个.java文件时, 在.java文件中的每个类都会有一个输出文件, 而该输出文件的名称与.java文件中每个类的名称相同, 只是多了一个后缀名.class.
  • Java可运行程序是一组可以打包并压缩为一个Java文档文件(JAR, 使用Java的jar文档生成器)的.class文件.
    • Java解释器负责这些文件的查找, 装载和解释.
  • 类库实际上是一组类文件. --- 每个文件都有一个public类, 以及任意数量的非public类.
    • 每个文件都有一个构建, 如果希望这些构件从属于同一个群组, 就可以使用关键字package.
    • 如果使用package语句, 它必须是文件中除注释以外的第一句程序代码.
  • package和import关键字允许你做的, 是将单一的全局名字空间分割开, 使得无论多少人使用Internet以及Java开始编写类, 都不会出现名称冲突问题.
  • 创建独一无二的包名: 一个包并没有把被打包的东西包装成一个单一的文件.
    • 将一个特定包的所有.class文件都置于一个目录下.
    • package名称的第一部分是类的创建者的反顺序的Internet域名.
  • Java解释器的运行过程:
    • 找出环境变量CLASSPATH.
    • 得到路径与CLASSPATH中的各个不同的项, 解释器就从这些目录中查找相关的.class文件(包括标准目录).
  • Java中没有条件编译功能, import能够切换开关并产生不同的行为.
  • 包的名称对应目录路径.
  • 包访问权限:
    • friendly: 表示当前的包中, 所有其他类对那个成员都有访问权限, 而对其他包的所有类都是private.
    • 同一个包中的类可以相互访问(public方法).
    • 提供访问器(accessor)和变异器(mutator)方法(也称作get/set方法).
  • ubuntu中添加路径的方法: java -cp path1:path2:.
    • javac -cp mindview.jar;. HelloWorld.javajavac -cp .:../../../net.mindview.jar *.java.
    • java -cp mindview.jar;. HelloWorldjava -cp .:../../../net.mindview.jar Assignment.
    • -cp(-classpath)一定要包含当前路径'.'.
    • 编译一个包的时候一定要加入一个-d .选项, 把所有的.java输出文件按照类的结构重新组织.
      • javac -cp .:../../../net.mindview.jar -d . *.java cookie2/Cookie.java dessert/Cookie.java mypackage/MyClass.java.
  • 访问权限的控制常被称为是具体实现的隐藏.
    • 每个单元都有单一的公共接口, 用public类来表现.
    • public类的名称必须完全与该编译单元的文件名相匹配, 包括大小写.
    • 编译单元完全不带public类也是可以的, 而且可以随意对文件命名.

复用类

  • 直接在自定义的类中声明其他类型.

  • 在派生类名称后紧跟关键字extends, 再接基类. --- 自动得到基类中所有的域和方法.
  • 用关键字super显示地编写调用街垒构造器的语句, 并配以适当的参数列表.
  • 将清理动作置于finally子句之中, 以防异常的出现.
    • final关键字: 数据, 方法, 和类.
      • final 数据:
        • 一个永不改变的编译时常量; --- 必须是基本数据.
        • 一个在运行时被初始化的值, 而不希望它被改变.
        • 空白final是指被声明为final但又未给定初值的域.
      • final 方法
        • 把方法锁定, 以防任何继承类修改它的含义.
        • 为了效率的考虑.
      • final 类:
        • 不打算继承该类. 也不允许别人这么做.
  • Java采用加载的一种方式来执行程序.
    • 类的代码在初始使用时才会被加载.

多态

  • 把某个对象的引用视为对其基类的引用的做法被称为向上转型.

接口

  • 接口和内部类提供了一种将接口与实现分离的更加结构化的方法.
  • 抽象类和抽象方法. --- interface关键字进行声明.
  • 完全解耦. --- 需要将所有的接口名都置于implements关键字之后. 并用逗号将它们一一隔开.
  • 通过继承来扩展接口.

内部类

  • 可以将一个类的定义放在另一个类的定义内部, 这就是内部类.
  • 连接到外部类.
  • 使用.this和.new.
  • 内部类与向上转型.
  • 在方法和作用与内的内部类.
  • 匿名的内部类.
  • 嵌套类.
  • 每个内部类都能独立地继承自一个接口的实现, 所以无论外围类是否已经继承了某个接口的实现, 对于内部类都没有影响.
  • 闭包是一个可调用的对象, 它记录了一些信息, 这些信息来自于创建它的作用域.
  • 编译的时候用$符标识内部类.