1. 面向对象设计概述
-
面向对象程序设计(OOP)是当今主流的程序设计范型
-
Java是完全面向对象的,必需熟悉Op才能编写Java程序
-
算法 + 数据结构 = 程序
-
类是构造对象的模版或蓝图。封装是与对象有关的一个重要概念(实现封装的关键在于绝对不能让类中的方法直接的访问其他类的实例域)
-
超类(Object)、继承(inheritation)
-
对象有三个特性:
- 行为
- 状态
- 标识
-
类之间的关系:
- 依赖(uses-a)
- 聚合(has-a)
- 继承(is-a)
-
应该尽可能的始相互依赖的类减至最少,用软件工程的专业术语来将就是让类之间的耦合度最小
-
表达类关系的UML符号(别看这个,看书,这个箭头我不回打!!p94)
关系 UML链接符 继承 ------------> 接口实现 - - - - - > 依赖 --------》 聚合 《------------ 关联 ------------ 直接关联 ---------
2. 使用预定义类
- 并不是所有类都有面向对象特征,比如Math
- 一个对象变量并没有实际包含一个对象,而仅仅引用一个对象
- 可以显示的将对象变量设置为null,表示没有引用任何对象
- 如果将一个方法应用于一个值为null的对象上,就回产生运行时错误
- 更改器方法:会修改对象状态的方法。访问器方法:不会修改对象状态的方法(例如get方法)
3. 用户自定义类
- 在一个源文件中,只能有一个公共类,但可以有任意数目的非公共类
- 方法前是public意味着,任何类的任何方法都可以调用这些方法。强烈建议类的实例域使用private
- 构造器(构造方法)总是伴随这new操作符的执行被调用,而不能对一个已经存在的对象调用构造器来达到重新设置实例域的目的
- 有关构造器:
- 构造器域类同名
- 每个类可以有一个以上的构造器
- 构造器可以有1个~多个参数
- 构造器没有返回值
- 构造器总是伴随new操作一起调用
- 不要在构造器中定义与实例域重名的局部变量:
public Employee() { String name = ""; } 这里,name没有任何意义
- 隐式参数(调用方法的对象名或者this)、显式参数(参数列表中的参数)
- 所有方法都必须在类的内部定义,但不表示他们是内联方法。是否将某个方法设置为内联方法是Java虚拟机的任务
- 注意不要返回编写返回引用可变对象的访问器方法
class Employee{ private Date hireDay; ... public Date getHireDay() { return hireDay;// Bad } ... } 这里可能就回发生错误: Date d = hman.getHireDay(); d.setTime(...); 这样我就可以改掉hman的hireday,这样是及其不正确的
- final关键字只是表示存储在变量里的对象引用不回再改变,但是这个对象可以改变,例如StringBulider就可以直接改变。
private final StringBuilder sb = “123424242”;
4. 静态域与静态方法
- 把一个变量设置为static:那么可以直接通过类名访问而不用通过对象实例访问这个变量或者方法
- 一般设置为final后,将域设计为public,这样不仅不能改变变量的值,还可以供其他类访问
- 静态方法只能使用静态变量
- 下面两张情况使用静态方法:
- 一个方法不需要访问对象状态,其所需参数都是通过显示参数提供
- 一个方法只需要访问类的静态域
5. 方法参数
-
- Java程序设计语言总是按值调用。也就是说,方法得到的是所有参数值的一个拷贝,特别是,方法不能修改传递给它的任何参数变量的内容。
-
- 然而,方法参数共有两张类型:
- 基本数据类型(数字、布尔型)
- 对象引用
- 然而,方法参数共有两张类型:
- 一个方法不肯呢个修改一个基本数据类型的参数、而对象引用作为参数就不同了,可以很容易的实现修改对象引用的对象内容
- 对象引用是按值传递的,总结Java中方法参数的使用情况:
- 一个方法不能修改一个基本类型的参数
- 一个方法可以改变一个对象参数的状态
- 一个方法不能让对象参数的引用一个新的对象
6. 对象构造
-
如果多个方法有相同的名字,不同的参数,便产生了重载,编译器决定具体执行哪个方法,它通过用各个方法的参数类型与特定方法调用锁使用的值类型进行匹配来挑选出相应的方法。如果编译器找不到匹配的参数,就回产生编译时错误(重载解析)
-
要完整的描述一个方法,需要只需方法名以及参数类型。这种叫做方法的签名。例如String类有4个indexof的方法。签名是:
indexOf(int) indexOf(int, int) indexOf(String) indexOf(String, int)
返回类型不是方法签名的一部分,也就是说,不能有两个名字相同、参数类型也相同、返回值不同的方法
-
如果在构造器中没有显式的给域赋予初值,那么就回自动的赋为默认值:数值为0、布尔值为false、对象引用为null
- 如果在编写一个类时没有编写构造器,那么系统回提供一个无参数构造器
- 如果类中至少又一个构造器,但是,没有提供无参数构造器,则在构造对象时如果没有提供参数就回视为不合法
-
Java中对象没有子对象,只有指向其他对象的指针
-
Java有三种初始化数据域的方法:
- 在构造器里设置值
- 在声明里赋值
- 初始化块赋值
-
首先运行初始化块,然后才运行构造器的主题部分
-
由于初始化数据与有多种途径,所以例如构造器构造过程的所有路径的具体处理步骤:
- 所有数据与被初始化为默认值
- 按照在类生命中出现的次序,依次执行所有域初始化语句的初始化块
- 如果构造器第一行调用来第二个构造器,则调用第二个构造器
- 执行这个构造器的主体
-
对象析构与finalize方法:Java有GC不需要关注内存问题,但是如果需要在程序结束之前回收一些资源,可以使用finalize,在Java GC之前调用