Java核心技术笔记-对象与类

概述

  • 面向对象是为了将程序分块,降低大规模程序开发和维护难度
  • Java所有的代码都位于某个类的内部
  • 对象的三个特性:
    • 行为(behavior)可以对对象施加的操作或方法
    • 状态(state)施加方法时对象如何响应
    • 标识(identity)辨识具有相同行为或状态的不同对象
  • 类之间的关系:
    • 依赖(dependence)(uses-a)
    • 聚合(aggregation)(has-a)
    • 继承(inheritance)(is-a)
  • 一个对象变量并没有实际包含一个对象,而仅仅引用一个对象
  • 修改对象的方法被称更改器方法(mutator method)
  • 只访问不修改的方法称为访问器方法(accessor method)

自定义类

  • 习惯上一个类存一个文件
  • 建议将实例域标记为private
  • 不要在方法中定义与实例域重名的局部变量
  • 每个方法都有一个隐式(implicit)参数,方法中可以用this表示隐式参数
  • 构造器的特点:
    • 构造器与类同名
    • 每个类可以有一个以上的构造器
    • 构造器可以有0个、1个或多个参数
    • 构造器没有返回值
    • 构造器总是伴随着new操作一起调用
  • 获得或设置实例域的值,需要提供下面三项内容:
    • 一个私有的数据域
    • 一个公有的域访问器方法
    • 一个公有的域更改器方法
  • 封装的好处:
    • 可以确保不受外界破坏,一旦出现错误可以定位到某个方法
    • 可以改变内部实现,不会影响其他代码
    • 更改器方法可以执行错误检查
  • 不要直接返回一个可变对象的引用,应该先对其进行克隆
  • 一个方法可以访问所属类的所有对象的私有数据
  • final修饰符大多用于基本(peimitive)类型域或不可变(immutable)域

静态域与静态方法

  • 静态域被称为类域,它属于类而不属于任何独立的对象
  • 静态方法没有隐式的参数,不能操作对象,但是可以访问自身静态域
  • 建议使用类名而不是对象来调用静态方法
  • 每个类里面都可以有一个main方法(用于测试)

方法参数

  • Java总是采用按值调用(call by value),方法得到的是参数值的拷贝
  • 一个交换两个对象的方法可以证明java是按值调用
  • 一个方法不能修改一个基本数据类型的参数
  • 一个方法可以改变一个对象参数的状态
  • 一个方法不能让对象参数引用一个新的对象

对象构造

  • java允许重载任何方法,方法名和参数叫做方法的签名
  • 编译器挑选具体执行哪个方法的过程叫做重载解析
  • 不对域进行初始化会影响代码可读性
  • 只有当没有编写构造器时,系统才会提供一个无参数的默认构造器
  • 但是写了构造器,参数不符合就会视为不合法
  • 显示初始化可以保证不管怎么调用构造器,实例域都有意义
  • 构造器中的this(…)可以调用另一个构造器
  • 初始化块形如{…},只要构造类的对象,就会被执行
  • 构造器执行步骤:
    1. 所有数据被初始化为默认值(0、false、null)
    2. 按照类声明中的顺序,依次执行初始化语句和初始化块
    3. 如果构造器调用了其他构造器,则执行其他构造器
    4. 执行构造器主体

类设计技巧

  • 一定要保证数据私有
  • 一定要对数据进行初始化
  • 不要再类中使用过多的基本类型
  • 不是所有的域都需要独立的访问器和更改器
  • 将职责过多的类进行分解
  • 类名和方法名要能体现职责
  • 优先使用不可变的类