欢迎访问悦橙教程(wld5.com),关注java教程。悦橙教程  java问答|  每日更新
页面导航 : > > 文章正文

Java — 类与对象(Core Java I),

来源: javaer 分享于  点击 49757 次 点评:9

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 0000开始到现在),并精确到毫秒。

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 类的设计技巧:

*  一定保证数据私有

*  一定要对数据初始化

*  不要再类中过度使用基本类型(利于理解+修改)

*  不必须写域访问器和域更改器

*  可以将职责过多的类进行分解

*  类和方法的名字要能体现他们职责

 

相关文章

    暂无相关文章
相关栏目:

用户点评