1、类
类是客观存在的,抽象的,概念的东西。
1)定义类的简单语法
4)十大常用类
每一个Java程序员都有一份属于自己的Java类排名表。这个排名表没有严格的规定,也没有可遵循的规则,它完全取决于你参与的Java项目的工作。下面这些类,不用我做过多的介绍,Java程序员都知道,因为它们在Java世界中非常的流行。
java.lang.String
String类无可争议的获得冠军,应该没有人会否认这一点。这是一个最终类,用于创建/操作不可变的字符串文字。它从JDK 1.0开始就有了。
java.lang.System
System类的使用取决于你工作的项目类型。你可能没有在项目中使用过它,但它仍然是受欢迎的Java类之一。这是一个不能被实例化的工具类。这个类的主要用途是访问标准输入、输出、环境变量等等。它自JDK 1.0开始可用。
java.lang.Exception
Throwable是所有错误和异常的超类。所有异常情况的处理都属于Exception类。NullPointerException在所有的异常中是最受欢迎的。而Exception异常是在所有异常层次结构的顶部。它自JDK 1.0开始可用。
java.util.ArrayList
一个实现数组的数据结构的类。这个类实现了List接口,是最受欢迎的Java集合类的成员。ArrayList和Vector之间的差异是初学者常见的问题之一,它也经常在java面试中被问到。它自JDK 1.2开始引入。
java.util.HashMap
一个实现键值对数据结构的类。这个类实现了Map接口。类似比较ArrayList与Vector,HashMap与Hashtable也是经常拿来比较的。它也是一个受欢迎的集合类,作为一个属性-值的容器,经常用在应用程序多个层之间的数据传递。它自JDK 1.2开始引入。
java.lang.Object
所有Java类的根类。每一个Java类都是Object类的一个子类。经常使用在平台/框架上。它包含了一些重要方法,比如:equals, hashcode, clone, toString等等。它自从Java诞生的第一天开始可用(JDK 1.0)
java.lang.Thread
线程是一个单一执行的序列,多个线程可以共同存在,共享资源。我们可以扩展Thread类,并创建自己的线程。当然,使用Runnable也是另一种选择。是否使用这个类取决于你的应用程序的需要。一个普通的应用程序是完全没有必要使用线程的。它自JDK 1.0开始引入。
java.lang.Class
Class类是一个直接继承Object类的子类。这个类没有构造函数,它们的对象是被Java虚拟机通过类加载器加载的。我们大多数人可能没有直接使用过它,但我认为它是一个重要的做反射的类。它自JDK 1.0开始引入。
java.util.Date
这是用来处理日期的类。有时候,我们觉得这个类应该加入更多的实用方法。就像每个企业级应用程序都会创建一个日期的实用工具单元。它自JDK 1.0开始引入,后来在JDK1.1中发生巨大变化,弃用了一大堆的方法。
java.util.Iterator
这是一个接口。它很受欢迎,用来替换枚举。这是一个简单易用的单元,它用Iterable同步工作。它自JDK 1.2开始引入。
2、对象
对象是具体的,实际的,代表一个事物。例如:车是一个类,汽车,自行车就是他的对象。
关于类与对象的描述:类是对象的模版,对象是类的一个个体。
1)对象的生命周期
[1]创建阶段(Created)
在创建阶段系统通过下面的几个步骤来完成对象的创建过程
l 为对象分配存储空间
l 开始构造对象
l 从超类到子类对static成员进行初始化
l 超类成员变量按顺序初始化,递归调用超类的构造方法
l 子类成员变量按顺序初始化,子类构造方法调用
一旦对象被创建,并被分派给某些变量赋值,这个对象的状态就切换到了应用阶段
[2] 应用阶段(In Use)
对象至少被一个强引用持有着。
[3]不可见阶段(Invisible)
当一个对象处于不可见阶段时,说明程序本身不再持有该对象的任何强引用,虽然该这些引用仍然是存在着的。
简单说就是程序的执行已经超出了该对象的作用域了。
举例如下图:本地变量count在25行时已经超出了其作用域,则在此时称之为count处于不可视阶段。当然这种情况编译器在编译的过程中会直接报错了。
[4]不可达阶段(Unreachable)
对象处于不可达阶段是指该对象不再被任何强引用所持有。
与“不可见阶段”相比,“不可见阶段”是指程序不再持有该对象的任何强引用,这种情况下,该对象仍可能被JVM等系统下的某些已装载的静态变量或线程或JNI等强引用持有着,这些特殊的强引用被称为”GC root”。存在着这些GC root会导致对象的内存泄露情况,无法被回收。
[5]收集阶段(Collected)
当垃圾回收器发现该对象已经处于“不可达阶段”并且垃圾回收器已经对该对象的内存空间重新分配做好准备时,则对象进入了“收集阶段”。如果该对象已经重写了finalize()方法,则会去执行该方法的终端操作。
这里要特别说明一下:不要重载finazlie()方法!原因有两点:
l 会影响JVM的对象分配与回收速度
在分配该对象时,JVM需要在垃圾回收器上注册该对象,以便在回收时能够执行该重载方法;在该方法的执行时需要消耗CPU时间且在执行完该方法后才会重新执行回收操作,即至少需要垃圾回收器对该对象执行两次GC。
l 可能造成该对象的再次“复活”
在finalize()方法中,如果有其它的强引用再次持有该对象,则会导致对象的状态由“收集阶段”又重新变为“应用阶段”。这个已经破坏了Java对象的生命周期进程,且“复活”的对象不利用后续的代码管理。
[6] 终结阶段(Finalized)
当对象执行完finalize()方法后仍然处于不可达状态时,则该对象进入终结阶段。在该阶段是等待垃圾回收器对该对象空间进行回收。
[7]对象空间重分配阶段(De-allocated)
垃圾回收器对该对象的所占用的内存空间进行回收或者再分配了,则该对象彻底消失了,称之为“对象空间重新分配阶段”。
2)有五种对象(PO,VO,DAO,BO,POJO)
PO,持久对象(Persistent Object),它们是由一组属性和属性的get和set方法组成。
在o/r映射的时候出现的概念,如果没有o/r映射,没有这个概念存在了。通常对应数据模型(数据库),本身还有部分业务逻辑的处理。可以看成是与数据库中的表相映射的java对象。最简单的PO就是对应数据库中某个表中的一条记录,多个记录可以用PO的集合。PO中应该不包含任何对数据库的操作。PO的属性是跟数据库表的字段一一对应的。PO对象需要实现序列化接口。
VO:value object值对象。通常用于业务层之间的数据传递,和PO一样也是仅仅包含数据而已。
但应是抽象出的业务对象,可以和表对应,也可以不,这根据业务的需要.PO只能用在数据层,VO用在商业逻辑层和表示层。各层操作属于该层自己的数据对象,这样就可以降低各层之间的耦合,便于以后系统的维护和扩展。
好处:这样可以减少大量的工作量(也就意味着减少bug,减少风险),也不需要担心未来的维护工作!
DAO:J2EE 开发人员使用数据访问对象(Data Access Object DAO)设计模式,以便将低级别的数据访问逻辑与高级别的业务逻辑分离。
DAO是Data Access Object数据访问接口,数据访问:顾名思义就是与数据库打交道。夹在业务逻辑与数据库资源中间。
核心J2EE模式中是这样介绍DAO模式的:为了建立一个健壮的J2EE应用,应该将所有对数据源的访问操作抽象封装在一个公共API中。用程序设计的语言来说,就是建立一个接口,接口中定义了此应用程序中将会用到的所有事务方法。在这个应用程序中,当需要和数据源进行交互的时候则使用这个接口,并且编写一个单独的类来实现这个接口在逻辑上对应这个特定的数据存储。
BO为Business Object的缩写,Business Object是业务对象层,表示应用程序领域内“事物”的所有实体类。
这些实体类驻留在服务器上,并利用服务类来协助完成它们的职责。 是对数据进行检索和处理的组件。是简单的真实世界的软件抽象。业务对象通常位于中间层。
业务对象可以在一个应用中自动的加入一个特定的功能来获得增值效应。使知识重用变为可能。比如,如果你要开发一个包含多货币处理的应用,你可以选择使用一个已经开发完成的,包含所有多货币处理功能的业务对象来开始你的开发。使您的开发工作极大的减少。
一、业务对象的必要条件
1.由状态和行为组成
2.表达了来自业务域的一个人,地点,事物或概念
3.可以重用
二、业务对象的分类
1、实体业务对象:
表达了一个人,地点,事物或者概念。根据业务中的名词从业务域中提取。如客户,订单,物品。
2、过程业务对象:
表达应用程序中业务处理过程或者工作流程任务。通常依赖于实体业务对象,是业务的动词。作为应用程序的管理者或者控制者。
3、事件业务对象:
表达应用程序中由于系统的一些操作造成或产生的一些事件。
POJO(Plain Old Java Objects)简单的Java对象,实际就是普通JavaBeans,是为了避免和EJB混淆所创造的简称。
在Java应用程序中的角色使用POJO名称是为了避免和EJB混淆起来, 而且简称比较直接. 其中有一些属性及其getter setter方法的类,没有业务逻辑,有时可以作为VO(value -object)或dto(Data Transform Object)来使用.当然,如果你有一个简单的运算属性也是可以的,但不允许有业务方法,也不能携带有connection之类的方法