JAVA学习笔记01——对象与类(1)
2021年1月22日 《JAVA核心技术 卷I》
面向对象程序设计概述
面向对象程序设计(object-oriented programming,OOP)
面向对象的程序由对象组成,每个对象包含对用户公开的特定功能部分和隐藏的实现部分。
将数据放在第一位,然后再考虑操作数据的算法。
面向对象更适合解决规模较大的问题。
类
类(class)是构造对象的模板或蓝图。
由类构造(construct)对象的过程称为创建对象的实例(instance)。
封装(encapsulation,有时候称为数据隐藏)就是将数据和行为组合在一个包里,并对对象的使用者隐藏具体的实现方式。
对象中的数据称为实例字段(instance field)。
操作数据的过程称为方法(method)。
特定对象的特定实例字段值的集合就是这个对象当前的状态(state)。
实现分装的关键在于绝对不能让类中的方法直接访问其他类的实例字段。程序只能通过对象的方法与对象数据进行交互。
封装提高了对象的重用性和可靠性。
OOP的另一个原则是可以通过扩展其他类来构建新类,这个过程称为继承(inheritance)。
对象
OOP中对象的3个主要特性:
对象的行为(behavior):可以对对象完成哪些操作,可以对对象应用哪些方法。
同一个类的所有对象实例,由于支持相同的行为而具有家族式的相似性。
对象的行为由科调用的方法来定义。
对象的状态(state):描述当前状态的信息。当调用方法时,状态不同,方法做出的响应不同。
状态的改变不是自发的,必须通过调用方法实现。
如果不调用方法就能改变状态,则说明封装性被破坏。
对象的标识(identity):可以区分具有相同行为和状态的不同对象。
作为同一个类的实例,每个对象的标识总是不同的,状态也往往存在差异。
对象的这些特性会相互影响。
识别类
在面向对象程序设计时没有所谓的“顶部”。
编写程序时,应首先从识别类开始,然后再为各个类添加方法。
识别类的简单经验是在分析问题时寻找名词,而方法对应动词。
类之间的关系
类之间最常见的关系有:
依赖(“use-a”):如果一个类的方法使用或操纵另一个类的对象,我们就说一个类依赖于另一个类。
应该尽可能的将相互依赖的类减至最少(减少耦合)。
聚合(“has-a”):包含。
继承(aggregation):标识一个更特殊的类和一个更一般的类之间的关系。
UML符号:
查看源图像
使用预定义类
在JAVA中,没有类就无法做任何事情。
对象与对象变量
要想使用对象,首先必须构造对象,并指定其初始状态。然后对对象使用方法。
在JAVA语言中,要使用构造器(constructor)构造新实例。
构造器是一种特殊的方法,用来构造并初始化对象。
构造器的名字应该与类名相同。
构造器总是结合new运算符来调用。
构造器没有返回值。
构造器可以有任意个参数。
每个类可以有多个构造器。
对象变量:
将需要多次使用的对象存放在一个变量中,这个变量叫对象变量。
对象变量并没有实际包含一个变量,它只是引用一个对象。
可以把java中的对象变量看作c++中的对象指针。
所有的java对象都存储在堆中,当一个对象包含另一个对象变量时,它只是包含着另一个堆对象的指针。
在java中,必须使用clone的方法来获得对象的完整副本。
更改器方法与访问器方法
调用后能使对象状态发生改变的方法是更改器方法(mutator method)。
只访问对象而不修改对象的方法有时称为访问器方法(accessor method)。
用户自定义类
主力类(work horse):
一般用来编写复杂应用程序。
通常没有main方法,却有自己的实例字段和实例方法。
公共类(public class):
带有public访问修饰符。public意味着任何类的任何方法都可以调用这个方法。
private确保只有类自身的方法能够访问这些实例字段。
一个源文件中只能有一个公共类,但可以有任意数目的非公共类。
多个源文件的使用
当一个源文件包含多个类时,可以使用通配符调用java编译器进行编译。
javac Employee*.java
用ver声明局部变量
如果可以从变量的初始值推导出它们的类型,那么可以用ver关键字声明局部变量,而无须指定类型。
ver 关键字只能用于方法中的局部变量。参数和字段的类型必须声明。
使用null引用
一个对象变量包含一个对象的引用,或者包含一个特殊值null,后者表示没有任何引用对象。
如果对null值应用一个方法,会产生一个NullPointerException异常。
定义一个类时,最好清楚地知道哪些字段可能为null。
应该尽量避免使用null参数。
隐式参数与显式参数
方法用于操作对象以及存储它们的实例字段。
方法操作或者访问的,出现在方法之前的对象称为隐式(implicit)参数。
在每一个方法中,关键字this指示隐式参数。可以将实例字段与局部变量明显地区分开来。
位于方法名后面括号中的值称为显式(explicit)参数。
封装的优点
字段访问器:只返回实例字段值。
优点:
除了该类的方法之外,不会影响其他代码。
更改器方法可以完成错误检查。
注意不要编写返回可变引用对象的访问器方法。这样会破坏封装性。
如果需要返回一个可变对象的引用,需要先对其进行clone。
基于类的访问权限
私有方法
在java中,要实现私有方法,只需将关键字public改为private即可。
final实例字段
可以将实例字段定义为final,这样的字段必须在构造对象时初始化。
final关键字表示存储在一个变量中的对象引用不会再指示另一个不同的对象。不过这个对象可以更改。
静态字段与静态方法
静态字段
如果将一个字段定义为static,每个类只有一个这样的字段。
static属于类,而不是一个单独的对象。
在这个类中构造的每一个对象都有一个自己的static字段,但这个类的所有实例共享一个static字段。
静态常量
可以直接通过类来访问。
Math.PI
不依存于对象。
静态方法
不在对象上执行的方法。
可以通过对象来访问静态方法。
工厂方法
工厂方法(factory method):不须构造器。
main方法
main方法也是一个静态方法。
main方法不对任何对象进行操作。
main方法执行并构造程序所需要的对象。
每一个类中可以有一个main方法。