首页天道酬勤类对象与实例对象的区别(java类和对象的区别)

类对象与实例对象的区别(java类和对象的区别)

admin 12-01 10:16 327次浏览

00-1010 1.对象创建是面向对象编程技术中不可缺少的东西。

创建类的对象实例是软件应用系统开发人员在面向对象的所有OOP编程开发中必须面对的问题。软件应用系统中的业务活动由对象实例之间的交互组成。然而,频繁创建对象实例不仅会降低软件应用系统的整体性能,还会增加程序类之间不必要的耦合关系。

如下图所示,雇员类和工时记录卡类之间存在“一对多”的关系,因为工时记录卡类的对象实例与雇员类的对象实例相耦合。

因此,如何正确合理地创建一个类的对象实例?什么时候应该创建类的对象实例?如何确保创建的类的对象实例能够被及时销毁?

实际上,上面的核心问题是软件应用系统的开发人员如何更高效、更松散地创建耦合,以实现程序模块的可伸缩性。是否要继续创建以下对象实例?

OracleDAO oneOracleDAO=new OracleDAO();

2.合理创建对象,减少程序类之间的耦合。

如果两个程序类之间存在包括控制关系、调用关系、数据传递关系在内的情况,那么两个程序类之间就会存在耦合关系。调用关系是通过目标对象实例中的外部函数服务方法(public method)实现的,因此软件应用系统的设计者有必要合理地创建对象实例,以降低程序类之间关系的耦合度。

下图中的Employee类和calculator类之间存在“依赖”关系,因为calculator类作为对象实例参与Employee类的函数方法calcSalary(Calculater strate)的参数。也就是说,Employee类的函数方法calcSalary在执行时依赖于计算器类的对象实例——。雇员类和计算器类之间存在“依赖”关系。

3.完善GRASP创作者的设计模式

通用任务分配软件模式(GRASP)中的创建者设计模式只是指导软件应用系统的设计者决定哪个目标程序类负责创建对象,并没有明确告诉开发人员应该采用什么形式和技术手段来完成创建对象的具体工作。

在本文及后续相关文章中,作者试图指导读者如何在软件应用系统的项目开发中合理地创建对象实例,以降低程序类之间关系的耦合度,进一步提高软件应用系统中程序类之间关系的设计能力。

4.在面向对象编程语言——中创建对象实例的传统方法使用新语句来创建对象实例。

(1)通过应用新语句创建一个对象实例。

在支持面向对象OOP编程技术的各种语言(如Java语言)中,提供了通过使用新语句创建对象实例和在程序类中提供公共构造方法的语法支持。例如,当您想要在Java编程语言的程序代码中创建表示用户信息的实体类UserInfoPO的对象实例时,可以使用以下语句:

UserInfoPO oneUserInfoPO=new UserInfoPO();

用新运算符创建对象实例一般需要三个基本过程:首先为对象实例分配一定的内存空间,然后调用对象所属类的构造方法,最后返回所创建对象实例的引用。

而且,只有Java编程语言中的对象实例化后,JVM虚拟机系统才能真正创建它,并为其分配适当的内存空间;如果直接使用一个对象而不实例化它,它将是一个空对象,并引发类型为NullPointerException的异常。

在下图所示的程序示例中,由于StudentInfo类的对象只定义了(StudentInfo oneStudent=null),但它尚未实例化为对象(oneStudent=new StudentInfo();)直接使用StudentInfo类的object oneStudent,从而生成NullPointerException空指针类型的异常(见下图控制台中的异常信息)。

当然,如果一个对象已经被实例化,但是采用了oneStudent=null这样的赋值语句,如果对象实例已经被删除,然后继续使用该对象,那么也会产生一个NullPointerException类型的异常。

,读者可以参见如下示图中的程序代码示例(注意其中黑体标识的语句)以及在控制台中显示的异常信息。

(2)了解对象的生命周期

Java程序设计语言中的对象生存期主要分为:创建、使用和销毁(删除)三个阶段。当对象失除其作用域时,JVM虚拟机系统自动在后台清除这些对象——如在某方法中创建了一个对象实例,当该方法返回时,也就无法再引用该对象实例。

当然,软件应用系统的开发人员也可强行提前清除某一对象,这只需要将它置为null 或者调用该对象中的close()方法。比如,对于物理数据库系统的数据库连接对象、文件IO对象等在使用完毕后,应该及时地释放该对象所占用的系统资源、并清除该对象。

5、常规的应用new语句创建对象实例方式所存在的问题

常规采用new操作符语句进行对象实例创建的方式存在一定的问题,首先需要在对象创建的语句中直接指定目标类的名称。一旦目标类名称发生变化,就需要修改该new语句中的目标类名称;其次在不同的方法中需要该对象实例时,都需要利用new语句对该对象进行创建。不仅产生了大量重复的对象实例创建的语句,而且也将对象实例创建的职责分散到不同的功能方法中。一旦对象实例的创建过程和要求发生变化时,就需要修改分散到不同的功能方法中的对象实例的创建语句,增加了代码维护的工作量。

另外,有些程序类的对象实例是不应该重复地创建的——比如数据库连接Connection对象等;其次,某些程序类只允许产生出单例的对象实例。对于对象实例创建时的这些基本的要求,采用普通的new操作符语句是做不到的。

因此,如何能够更高效地创建对象实例、并且松耦合以达到程序模块的可扩展性和可维护性?

6、利用工厂设计模式分离对象实例的创建逻辑和对象实例的使用逻辑

为了能够降低程序类之间关系的耦合度,软件应用系统的开发人员有必要合理和有效地创建对象——也就是需要分离对象实例的创建逻辑和对象的使用逻辑。对象的使用方只需要了解对象对外的功能方法的接口,而不需要自行负责对该对象的创建工作。封装对象的创建过程和逻辑、并将对象的创建职责由某个特定的功能类(如工厂类)承担——这是对面向对象OOP设计方法中的"单一职责设计原则"的具体应用。

一旦能够分离对象实例的创建逻辑和对象实例的使用逻辑,也就能够降低由于对象实例的创建而产生的程序类之间关系的耦合度。当被创建的目标对象所在的程序类的代码发生变化时,不需要修改分散到不同功能方法中的对象创建的new操作符语句,而只需要集中修改承担对象实例创建职责的工厂类中的对象实例的创建方法。

下图所示的黑体部分所标识的代码,表示在示例项目银行账户信息管理系统中,利用数据库连接对象的工厂类ConnectDBFactory中的newConnectDBBean方法创建出对应的对象实例的程序代码。

如下程序为数据库连接对象的工厂类ConnectDBFactory类的完整程序代码示例,在ConnectDBFactory工厂类中应用了观察者设计模式。其中的工厂方法newConnectDBBean接收需要创建对象的类名称参数,并返回目标对象所在的接口类型的对象实例。

package com.px1987.webbank.factory; import com.px1987.webbank.config.ClassNameConfig; import com.px1987.webbank.dao.*; import com.px1987.webbank.dao.inter.ConnectDBInterface; import com.px1987.webbank.exception.*; import java.util.Observable; import java.util.logging.*; public class ConnectDBFactory extends Observable { public ConnectDBInterface newConnectDBBean(String connectDBBeanClassName) throws WebBankException { ConnectDBInterface connectDBBean=null; Class oneClass=null; try { oneClass = Class.forName(connectDBBeanClassName); } catch (ClassNotFoundException e){ int logImpleKind=Integer.parseInt(ClassNameConfig.getProperty("logImpleKind")); this.addObserver(LogInfoFactory.newLogInstance(logImpleKind)); this.setChanged(); //注意要设置变化点 notifyObservers(e); //当出现异常时将通知各个观察者 throw new WebBankException("不能正确地获得"+connectDBBeanClassName+"类"); } try { connectDBBean = (ConnectDBInterface)oneClass.newInstance(); } catch (InstantiationException e){ int logImpleKind=Integer.parseInt(ClassNameConfig.getProperty("logImpleKind")); this.addObserver(LogInfoFactory.newLogInstance(logImpleKind)); this.setChanged(); //注意要设置变化点 notifyObservers(e); //当出现异常时将通知各个观察者 throw new WebBankException("不能正确地创建"+connectDBBeanClassName+"类的对象实例"); } catch (IllegalAccessException e) { int logImpleKind=Integer.parseInt(ClassNameConfig.getProperty("logImpleKind")); this.addObserver(LogInfoFactory.newLogInstance(logImpleKind)); this.setChanged(); //注意要设置变化点 notifyObservers(e); //当出现异常时将通知各个观察者 throw new WebBankException("不能正确地创建"+connectDBBeanClassName+"类的对象实例"); } return connectDBBean; } }

如何正确应用Web MVC架构模式分离表示层和模型层耦合关系

项目实训及课程设计——如何合理地设计软件应用系统Web表示层

如何应用数据访问服务层分离系统中的业务层和持久层之间耦合关系

项目实训及课程设计指导——Web表示层典型功能实现的应用实例

如何正确设计J2EE应用系统持久层中各个组件结构及组件间关系

雷士灯具管理系统
电容性耦合(耦合性等级) 人机用英文怎么写(人机协同定义)
相关内容