Java — 类与对象(Core Java I),
Java — 类与对象(Core Java I),
第四章
对象与类 1
1.面向对象与面向过程:
对于一些规模较小的问题将其分解为过程的开发是理想的,而对于规模较大的问题,面向对象更加适合。
2.类
类是构造对象的模板。由类构造对象的过程称为创建实例。
封装就是将数据和行为组合在一个包中,并对对象有关使用者隐藏数据的实现方式。对象中的数据称为实例域,操纵数据的过程称为方法。对于每一个特定对象都有一组特定的实例域值。这些值得集合就是这个对象的当前状态。
封装给予了对象“黑盒”特征,这是提高重用性和可靠性的关键。这就意味着一个类可以全面的改变存储数据的方式。
继承是扩展后的新类具有所扩展的类的全部属性和方法。
3.对象
要想使用好OOP要搞清楚对象的三个主要的特征:
1对象的行为 可以对对象施加哪些操作和方法
2对象的状态 施加方法之后,对象如何响应
3对象的标识 辨别有相同行为和状态的不同对象
4.类之间的关系(转载:http://www.cnblogs.com/liuling)
一、继承关系 继承指的是一个类(称为子类、子接口)继承另外的一个类(称为父类、父接口)的功能,并可以增加它自己的新功能的能力。在Java中继承关系通过关键字extends明确标识,在设计时一般没有争议性。在UML类图设计中,继承用一条带空心三角箭头的实线表示,从子类指向父类,或者子接口指向父接口。
二、实现关系 实现指的是一个class类实现interface接口(可以是多个)的功能,实现是类与接口之间最常见的关系。在Java中此类关系通过关键字implements明确标识,在设计时一般没有争议性。在UML类图设计中,实现用一条带空心三角箭头的虚线表示,从类指向实现的接口。
三、依赖关系 简单的理解,依赖就是一个类A使用到了另一个类B,而这种使用关系是具有偶然性的、临时性的、非常弱的,但是类B的变化会影响到类A。比如某人要过河,需要借用一条船,此时人与船之间的关系就是依赖。表现在代码层面,为类B作为参数被类A在某个method方法中使用。在UML类图设计中,依赖关系用由类A指向类B的带箭头虚线表示。
四、关联关系 关联体现的是两个类之间语义级别的一种强依赖关系,比如我和我的朋友,这种关系比依赖更强、不存在依赖关系的偶然性、关系也不是临时性的,一般是长期性的,而且双方的关系一般是平等的。关联可以是单向、双向的。表现在代码层面,为被关联类B以类的属性形式出现在关联类A中,也可能是关联类A引用了一个类型为被关联类B的全局变量。在UML类图设计中,关联关系用由关联类A指向被关联类B的带箭头实线表示,在关联的两端可以标注关联双方的角色和多重性标记。
五、聚合关系 聚合是关联关系的一种特例,它体现的是整体与部分的关系,即has-a的关系。此时整体与部分之间是可分离的,它们可以具有各自的生命周期,部分可以属于多个整体对象,也可以为多个整体对象共享。比如计算机与CPU、公司与员工的关系等,比如一个航母编队包括海空母舰、驱护舰艇、舰载飞机及核动力攻击潜艇等。表现在代码层面,和关联关系是一致的,只能从语义级别来区分。在UML类图设计中,聚合关系以空心菱形加实线箭头表示。
六、组合关系 组合也是关联关系的一种特例,它体现的是一种contains-a的关系,这种关系比聚合更强,也称为强聚合。它同样体现整体与部分间的关系,但此时整体与部分是不可分的,整体的生命周期结束也就意味着部分的生命周期结束,比如人和人的大脑。表现在代码层面,和关联关系是一致的,只能从语义级别来区分。在UML类图设计中,组合关系以实心菱形加实线箭头表示。
七、总结 对于继承、实现这两种关系没多少疑问,它们体现的是一种类和类、或者类与接口间的纵向关系。其他的四种关系体现的是类和类、或者类与接口间的引用、横向关系,是比较难区分的,有很多事物间的关系要想准确定位是很难的。前面也提到,这四种关系都是语义级别的,所以从代码层面并不能完全区分各种关系,但总的来说,后几种关系所表现的强弱程度依次为:组合>聚合>关联>依赖。
5.使用预定义类
构造器方法:用来构造并初始化对象。
访问器方法:仅访问实例域而不进行修改的方法。
更改器方法:对实例域做出修改的方法。
Date类:
Date类表示格林尼治标准时间(从1970.1.1 00:00开始到现在),并精确到毫秒。
GregorianCalendar类实现的日历:
代码:
6.自定义类(设计复杂应用程序所需要的主力类-work。horse class)
要想创建一个完整的程序,应该将若干个类组合在一起,其中只有一个main方法。
代码:
7.封装的优点
直接提供一个简单的公有数据域
l 一个私有的数据域
l 一个public的域访问器方法
l 一个public的域更改器方法
后者 做的优点是改变类的内部实现,除了类的方法之外,不会影响其他代码。
8.类的访问权限
类的方法可以该类的任何一个对象的私有域。
9.私有方法的重要应用
将绝大多数方法设为公有的,但是有时候安全起见,需要将一些代码分成若干独立的辅助方法,这些辅助方法不该成为公共接口的一部分,因为他们和实现机制紧密相连(一个特别的协议、一个特别的调用次序),我们最好将这样的方法设计为private的。
10.final实例域
Final修饰符大都用在基本类型域或者不可变得域(类中的每个方法都无法改变其),而对于一些可变的类来说,final的意义仅仅是 引用变量的对象引用在对象的构造之后不能再改变。
类与对象 2
1 静态域与静态方法
* 静态域: 如果将域定义为static,每个类中只有一个这样的域。就是说在这个类定义下的所有对象都用这一个static域。
* 静态常量:类的常量。举个例子 -> Math.PI
注:
* 最好不要将类的域设为public(类的每个对象都可以公有域进行修改),而公有常量(final域)却没问题。
* 若方法不是用java语言实现的则可以绕过java语言存取控制机制,例如System类的setOut方法。
* 静态方法: 一种不能向对象实施操作的方法;
没有this参数的方法。
2 Main方法:每个类都可以有一个main方法,只是执不执行的问题。
3 方法参数:
* Java总是采用按值调用。也就是说方法得到的是所有参数值的一个拷贝,方法不能修改传递给它的任何参数变量内容。
* 如果要改变对象的参数状态就需要自己写个改造器(改变对象状态的方法)。
4 多种构造器的写法
* 重载:多个方法,相同的名字,不同的参数。
* 无参数的构造器:在编写一个类的时候忘记了写构造器,系统会给我们自动添加一个无参数的构造器,于是,实例域里面的数值型->0、boolean->false、对象->null。
注意:只有在 类没有提供任何构造器时系统才会提供无参数构造器。
* this 的引用 方法的隐式参数 外还可以this(…),这个构造器将调用一个类的另一个构造器。
* 初始化块
Pulic class Hello{
static{…
}
}
在类的第一次加载,静态域进行初始化,若是默认值则同上。
5 对象析构
* 分配给对象的内存空间在对象不使用之后一定要收回来,因为java提供了垃圾回收机制,所以其不支持析构器
* 对于对象使用的内存之外的东西(系统资源的另一个对象的句柄),在对象不使用之后,回收同样重要(请查看API之 shutdown hook)。
6 包:
* 利用包机制 可以方便的管理自己代码和别人的代码(或者代码库)
* 曾经的Sun公司建议将公司的因特网域名的(独一无二性)以逆序的形式作为包名。
* 类的导入(import)与将类放入包(package)中
* 包的作用域
Public -> 任意类
Private -> 被定义他们的类
默认 –> 同一个包中的所有类
7 类路径 (classpath)
这里做一个强调:javac 编译器总是在当前目录中查找文件,java虚拟机仅在类路径中有“.”的目录中查找。
8 文档注释
² Javadoc可以生成一个html文档。
² /**开始的注释可以将代码和注释保存在一个地方
² 注释的插入、类注释、方法注释、域注释、通用注释、包与概述注释、注释的抽取->这些东西在日后开发需要的时候再看。
9 类的设计技巧:
* 一定保证数据私有
* 一定要对数据初始化
* 不要再类中过度使用基本类型(利于理解+修改)
* 不必须写域访问器和域更改器
* 可以将职责过多的类进行分解
* 类和方法的名字要能体现他们职责
相关文章
- 暂无相关文章
用户点评