2020 年 6 月 3 日 对象与类
本章主要介绍以下内容:1、面向对象的程序设计 2、如何创建标准java类库中的对象 3、如何编写自己的类。
1、面向对象程序设计概述
面向对象程序设计简称OOP,是当今主流的程序设计范型,Java是完全面向对象的,面向对象的程序是由对象组成的,每个对象包含对公共用户公开的特定功能部分和隐藏的实现部分。
传统的结构化程序设计通过设计一系列的过程来求解问题(即算法)。
1、类
类是构造对象的模板。
由类构造对象的过程称为创建类的实例。
封装是与对象有关的一个重要概念,对象中的数据称为实例域,操纵数据的过程称为方法。对于每个特定的类实例都有一组特定的值,这些值的集合就是这个对象的当前状态
2、对象
对象最重要的三个特征:
1、对象的行为——用可以调用的方法来进行定义
2、对象的状态——每个对象都保持着描述当前特征的信息
3、对象标识——每个对象都有一个唯一的标识
3、类之间的关系
依赖 (“use-a”)
聚合(“has-a”)
继承(“is-a”)
依赖 :是一种最常见,最明显的关系,如果一个类的方法操纵另一个类的对象,我们就说一个类依赖依赖另一个类。例如:订单表依赖账户表的信息。
聚合:是一种具体且容易理解的关系,聚合关系意味着类A对象包含类B的对象。例如:一个订单对象包含很多子订单的信息。
继承:是一种用于表示特殊和一般的关系的。例如Management继承自Employee
UML:Unified Modeling Lanaguage 统一建模语言,是用来绘制类图的,用来描述类与类之间的关系的
表达类关系的UML符号:
2、使用预定义类
1、对象与对象变量
要想使用对象,就必须首先构造对象,并指定其初始状态,然后对对象应用方法。
Java中使用构造器构造新实例。
new Date();
构造器的名字应该与类名相同
一定要认识到:一个对象变量并没有实际包含一个对象,而仅仅引用一个对象。在Java中任何对象变量的值都是对存储在另一个地方的一个对象的引用。new 操作符的返回值也是一个引用。
如果讲一个方法应用于值为null的对象上,那么就会产生运行时错误。
2、Java类库中的LocalDate
时间是用距离一个固定时间点的毫秒数表示的,这个点就是所谓的纪元
Java类库的设计者决定将保存时间与给定时间点命名分开,所以Java类库总包含了两个类:
一个是用来表示时间点的Date类,另一个是用来表示大家熟悉的日历表示法的LocalDate类。
不要使用构造器来构造LocalDate对象,应该使用静态工厂方法代表你调用构造器:
LocalDate.now();
3、用户自定义类
1、Employee类
在Java中最简单的类的定义形式:
2、多个源文件的使用
一个文件中如果包含了两个类,将可以有两种方法编译程序的方法:
一种是使用通配符嗲用java编译器:
javac Employee*.java
另一种是 javac EmployeeTest.java 当编译器发现EmployeeTest.java中使用了Employee类时,会自动查找Employee.class文件,如果没有找到class文件会自动搜索Employee.java 文件,然后对它进行编译。
3、从构造器开始
构造器的特征:
构造器必须与类同名
每一个类可以有一个以上的构造器
构造器可以有0个、1个或多个参数
构造器没有返回值
构造器总是伴随着new操作一起被调用
4、隐士参数和显示参数
隐式参数:方法的调用者称为隐式参数
显示参数:位于方法名后面括号中的数值就是显示参数
5、封装的优点
方法体中可以直接改变内部的实现,除了该类的方法之外不会影响其他的代码。
6、基于类的访问权限
一个方法可以访问所属类的所有对象的私有数据。
7、私有方法
一个方法如果被private 修饰,那么该方法只能在类中进行使用。不会被外部的其他类操作调用
8、final实例域
可以将域定义为final,构建对象时必须初始化这样的域,也就是必须确保在每一个构造器执行之后,这个域的值被设置,并且在后面的操作中不能被修改。
fianl修饰符大多都应用于基本类型域,或不可变类的域
4、静态域与静态方法
1、静态域
如果将域定义为static,每个类中只有一个这样的域,而每个对象对于所有的实例域却都有自己的一份拷贝,例如每一个雇员对象都有一个自己的id域,但是这个类的所有实例域将共享一个nextid域。
静态域属于类,而不属于任何变量。
2、静态常量
静态变量使用的比较少,但静态常量却使用的比较多。
例如: public static final double PI =3.14
3、静态方法
静态方法是一种不能向对象实施操作的方法。例如Math的pow方法就是一个静态方法。
静态方法可以通过类名来进行调用。
使用静态方法的两种情况:
1、一个方法不需要访问对象状态。其所需的参数都是通过显示参数提供
2、一个方法只需要访问类的静态域
4、工厂方法
静态方法还有另一种常见的用途。类似LocalDate和NumberFormat的类使用静态工厂方法来构造对象。
例如:NumberFormat.getCurrencyInstance();
5、main方法
main方法不对任何对象进行操作。事实上,在启动程序时,还没有任何一个对象、静态的main方法将执行并创建程序所需的对象。
5、方法参数
按值调用:表示方法接收的是调用者提供的值
按引用调用:表示方法接收的是调用者提供的变量地址。
一个方法可以修改传递引用所对应的变量值,而不能修改传递值所对应的变量值
方法参数一共有两种类型:
1、基本数据类型
2、对象引用
重点:1、一个方法不能修改一个基本数据类型的参数
2、一个方法可以改变一个对象参数的状态
3、一个方法不能让对象参数引用一个新的对象
6、对象构造
1、重载
如果有多个方法有相同的名字、不同的参数,便产生了重载
2、默认域实例化
如果在构造器中没有显式的给域赋予初始值,那么就会被自动的赋为默认值:
数值为0,布尔值为false,对象引用为null
3、无参数的构造器
如果在编写一个类时没有编写构造器,那么系统会提供一个无参数构造器,对象由无参数构造函数创建时,状态会设置为适当的默认值
5、调用另一个构造器
关键字this引用方法的隐式参数。然而这个this还有另外一个含义。
如果构造器的第一个语句形如this(...),这个构造器将调用同一个类的另一个构造器
6、初始化块
在一个类的声明中,可以包含多个代码块,只要构造类的对象,这些块就会被执行。
调用构造器具体的处理步骤:
1、所有的数据域初始化为默认值(0,false,null)
2、按照在类声明中出现的次序,一次执行所有域初始化语句和初始化块
3、如果构造器第一行调用了第二个构造器,则执行第二个构造器的主体。
4、执行这个构造器的主体
可以使用一个静态的初始化块来对静态域进行初始化。
在类第一次加载的时候,将会进行静态域的初始化。与实例域一样,除非他们显式的设置为其他值,否则默认的初始值是0、false、null。
所有得静态初始化语句块以及静态初始化块都将依照类定义的顺序执行
7、包
使用包的原因是确保类名的唯一性。java允许使用包将类组织起来,借助于包可以方便的管理自己的代码。
1、类的导入
我们可以采用两种方式访问另一个包中的公有类:
第一种方式是在每个类名之前写完整的包名。
第二种方式是使用import
2、静态导入
import不仅可以导入类,还可以导入静态方法和静态域的功能
例如 : import static java.lang.System.*;
不过这种写法不利于代码的维护,一般采用类名.静态方法名来进行调用
3、将类放入包中
就是在源文件的开头添加 package (包名);
4、包作用域
标记为public的部分可以被任意的类使用;
标记为private的部分只能在被定义它们的类中使用
如果没有指定private和public那么这个部分可以被同一个包中的所有方法访问
8、类路径
在前面可以看到,类存储在文件系统的子目录中,类的路径设置必须与包名匹配。
另外类文件也可以存储在JAR文件中,一个jar文件可以包含多个多个压缩形式的类文件和子目录。
为了使类能够被多个程序共享,需要做到以下几点:
1、把类放到一个目录中。
2、将JAR文件放在一个目录中
3、设置类路径,类路径是所有包含类文件的路径的集合。
在unix系统中,类路径中的不同项目之间用冒号分割;而在windows系统中用分号分割;句点表示当前目录。
设置类路径:
最好采用-classpath选项指定类路径
java -classpath /home/user/classdir:.:/home/user/archives/archive.jar MyProg
linux中运行一个java文件的方式:
编译生成test.class文件 : javac test.java 【这里没有包名,直接编译到当前文件夹】
运行: java test
9、文档注释
1、注释的插入
javadoc实用程序从以下几个特征中抽取信息:
1、包
2、公有类和接口
3、公有的和受保护的构造及方法
4、公有的和受保护的域
2、类注释
类注释必须要放到import语句之后,类定义之前
3、方法注释
@param变量描述
@return描述 这个标记对当前方法添加“return”(返回)部分
@throws 类描述 这个标记将添加一个注释,用于表示这个方法有可能抛出的异常
4、域注释
只需要对公有域建立文档,通常指的是静态常量
5、通用注释
@author 姓名
@Version 版本
@since 文本
6、包与概述注释
要想产生包注释,就需要在每一个包目录中添加一个单独的文件,可以有如下两个选择;
1、提供一个package.html命名的HTML文件。在标记<body><body>之间的所有文本都会被提取出来
2、提供一个package-info.java文件,除了package语句之外,只有注释存在
10、类设计技巧
1、一定要保证数据私有
2、一定要对数据初始化
3、不要在类中使用过多的基本类型
4、不是所有的域都需要独立的域访问器和域更改器
5、将职责过多的类进行分解
6、类名和方法名要能体现他们的职责
7、优先使用不可变的类
版权声明: 本文为 InfoQ 作者【瑞克与莫迪】的原创文章。
原文链接:【http://xie.infoq.cn/article/d8bd909cc27e211a78e70e6d7】。文章转载请联系作者。
评论