面向对象程序设计概述
面向对象程序设计(简称OOP):面向对象的程序是由对象组成的,每个对象包含对用户公开的特定功能部分和隐藏的实现部分。
对于一些规模比较小的问题,将其分解为过程的开发方式比较理想。而面向对象更加适用于解决规模较大的问题。
类
类是构造对象的模板或蓝图,由类构造对象的过程称为创建类的实例。
封装:封装是将数据和行为组合成一个包中,并对对象的使用者隐藏了数据的实现方式。对象中的数据称为实例域,操纵数据的过程称为方法。
类之间的关系
- 依赖(uses-a):如果一个类的方法操纵另一个类的对象,就说一个类依赖与另一个类。
- 聚合(has-a):如一个A对象包含B对象,意味着类A的对象包含类B的对象。
- 继承(is-a):类A继承类B,会继承类B的方法,还会扩展额外拥有一些功能。
使用预定义类
要想使用对象,就必须首先构造对象,并制定其初始状态。Java中使用构造器来构造新实例并初始化对象。
一个对象变量并没有实际包含一个对象,而仅仅引用一个对象。
Java对象都在堆中。
LocalDate类
- Date类:表示时间点
- LocalDate类:日历表示法
LocalDate类不是用构造器构造的,而是使用静态工厂方法调用的。
用户自定义类
若干类组合使用的时候,只有一个类有main方法。在一个源文件中,只有一个公有类,可以有任意数目的非公有类。
可以用public标记实数域,但这是不提倡放入做法。public数据域允许程序中任何方法对其进行读取和修改,破坏了封装性。
构造器的特点:
- 构造器与类同名
- 每个类可以有一个以上的构造器
- 构造器可以有0个、1个或多个参数
- 构造器没有返回值
- 构造器总是伴随着new操作一起调用
基于类的访问权限:方法可以访问所属类的所有对象的私有数据。
final实例域
final修饰符大都应用于基本类型域,或不可变类的域(如类中的每个方法都不会改变其对象,就是不可变类)。
对于可变的类,使用final修饰符会带来迷惑。
- private final StringBuilder strBuild
- 初始化:strBuild=new StringBuilder();
- 更改值:strBuild.append(LocalDate.now()+”,hello world”);
Final关键字只是表示存储在strBuild变量中的对象引用不会再指示其他StringBuilder对象。
静态方法
静态方法是一种不能像对象实施操作的方法。
使用静态方法的情况:
- 一个方法不需要访问对象状态,其所需参数都是通过显示参数提供
- 一个方法只需要访问类的静态域
方法参数
- 按值调用:表示方法接受的是调用者提供的值
- 按引用调用:表示方法接受的是调用者提供的变量地址
Java中始终按值调用,方法得到的是所有参数值的一个拷贝,方法不能修改传递给它的任何参数变量的内容。Java中方法参数使用情况:
- 一个方法不能修改一个基本数据类型的参数(即数值型或布尔型)
- 一个方法可以改变与一个对象参数的状态
- 一个方法不能让对象参数引用一个新的对象
对象构造
重载
如果多个方法有相同的名字,不同参数,便产生重载。 编译器通过方法的参数类型和参数值来匹配方法。
finalize方法
Java垃圾收集器只会收集new出来的对象,一些特殊产生的对象需要通过finalize方法来回收。可以为任何一个类添加finalize方法。finalize方法将在垃圾回收期清除对象之前调用。
类设计技巧
- 一定要保证数据私有
- 一定要对数据进行初始化
- 不要在类中使用过多的基本类型
- 不是所有的域都需要独立的域访问器和域更改器
- 将职责过多的类进行分解
- 类名和方法名要能够体现他们的职责
- 优先使用不可变的类