设为首页 加入收藏

TOP

OOP语言技术比较:Java,C++,Object Pascal(二)
2014-11-24 01:15:22 来源: 作者: 【 】 浏览:28
Tags:OOP 语言 技术 比较 Java Object Pascal
在一些局部数据上的操作。


·C++:下面是一个简单类的C++定义:


class Date {
private:
int dd;
int mm;
int yy;
public:
void Init(int d, int m, int y);
int Day();
int Month();
int Year();
};


下面是其中一个方法的定义:
void Date::Init(int d, int m, int y)
{
dd = d;
mm = m;
yy = y;
}


·Java:Java的语法与C++语法类似:
class Date {
int dd = 1;
int mm = 1;
int yy = 1;
publlic void Init(int d, int m, int y) {
dd = d; mm = m; yy = y; }
public int Day () { return dd; }
public int Month () { return mm; }
public int Year () { return yy; }
}


两者之间最大的不同在于Java的方法代码在声明的同时就定义了(与C++不同,这并不表示这些函数是内联函数),并且可以同时初始化类的数据成员。事实上,如果你没有初始化这些数据成员,Java会将所有数据成员初始化为默认值。


·OP:在Object Pascal的类声明语法更接近C++语法,但是仍有很多区别:


type
Date = class
private
dd, mm, yy: Integer;
public
procedure Init (d, m, y: Integer);
function Month: Integer;
function Day: Integer;
function Year: Integer;
end;


procedure Date.Init (d, m, y: Integer);
begin
dd := d;
mm := m;
yy := y;
end;


function Date.Day: Integer;
begin
Result := dd;
end;


你可能注意到一些语法上的区别:定义方法使用两个不同的关键字function和procedure,没有参数的方法不使用圆括号,方法在类定义中声明,之后再作定义(就像C++中经常遇到的情况一样)。注意,Pascal使用点运算符,而C++使用作用域操作符(::)。


·注意:访问当前对象。OOP语言的方法与全局函数不同,它包含了一个隐藏参数——一个指向当前被操作对象的指针或引用。在不同的语言中,这个参数的名字不同,在C++和Java中是this,在Object Pascal中是self。


构造函数(constructor
·特性描述:上文所述的类实在太简单了。为了解决对象初始化的问题,我们要为类增加一个构造函数,这也是改进类所需迈出的第一步。


·C++:在C++以及Java中,构造函数和类具有相同的名字。如果你没有定义构造函数,编译器会自动为类添加一个默认构造函数。在这两种语言中,你的类可以具有多个构造函数,这要感谢“方法重载”。


·Java:在Java中,虽然构造函数也被称为初始化函数(initializer),但与C++的构造函数在使用上没有什么区别。需要注意的是,Java虚拟机负责创建对象,而构造函数只对创建的对象进行初始化(Object Pascal也有类似的情况)。


·OP:在Object Pascal中,构造函数以一个特殊的关键字——constructor声明。在OP中没有方法重载(?,没有吗?——译者),不过因为构造函数(在Delphi的书中通常成为构造器——译者)的名字可以任意指定,所以你可以提供几个名字不同的构造函数。OP中每个类都有默认的构造函数“Create”,除非你用名字相同而参数不同的构造函数将其覆盖。这个构造函数继承自一个通用基类,下面我们会提到。


析构函数和finalize()
·特性描述:析构函数扮演了构造函数反面的角色,通常在对象销毁时被调用。如果说大多数类都需要构造函数,那么只有很少的类需要析构函数。一个析构函数的基本功能就是释放构造函数(以及对象生存期中的其它方法)分配的资源。这些资源包括内存、文件、数据库表、Windows句柄,等等。


·C++:C++的析构函数在对象超出作用域时,或者删除动态创建对象时自动被调用。每个类只能由一个析构函数。


·OP:Object Pascal的析构函数与C++的析构函数类似。Object Pascal使用标准虚拟析构函数,称为“Destroy”。析构函数通过标准“Free”方法调用。因为所有对象都是动态创建的,所以你或者对象的属主必须调用对象的析构函数,以释放资源。理论上你可以定义多个析构函数,不过只有你手动调用析构函数才有些价值(没有什么是自动完成的)。


·Java:Java没有析构函数。没有引用的对象将被碎片回收程序在后台销毁。在销毁对象之前,碎片回收程序调用finalize()方法。但是,并没有什么保证这个函数真正被调用(至少在Java 1.0中时是这样)。因此,如果你需要释放资源,你就要定义一个方法,并保证它被调用。


类封装(PrivatePublic
·特性描述:这三种语言提供了相同的三种访问限定符来提供不同级别的类封装:public,protected和private。public意味着对于任何类都是可见的,protected意味着对于派生类可见,private意味着没有外部可见性。但是三种语言的实现细节并不相同。


·C++:在C++中,你可以使用friend关键字跳出类封装。由class关键字声明的类默认可见性是private,由struct关键字声明的类默认可见性是public。


·OP:在Object Pascal中,private和protected关键字只对在不同单元中的类有作用。在同一单元(源代码文件)声明的类彼此之间可以自由访问。Delphi还有两个特殊的访问限定符:published和automated。published将为类的成员建立RTTI(运行期类型信息),automated用于OLE自动化接口(已废弃——译者)。


·Java:在Java中,一个语法上的区别是每一个类成员都要用访问限定符声明。另一个实质上的区别是,Java中类成员默认访问限定符是friendly,因此对同一个包(源代码文件,类似于OP的单元)中的所有类都是可见的。同样,protected关键字表示类成员对派生类可见,同时也对同一个包中的其它类可见,而private protected才对应于C++中的protected。


文件、单元和包
·特性描述:这三种语言的一个重要区别是对源代码文件的组织管理。它们都使用文件作为储存源代码的标准机构(与其它OOP语言如Smalltalk不同),不同的是C++的编译器并不真正了解文件,而OP和Java则不同,它们使用模块概念来管理文件,虽然各自的名字不太一样。


·C++:在C++中,程序员们一般把类定义放在头文件中,而把方法实现放入独立的代码文件。通常这两个文件会具有相同的文件名和不同的扩展名。一个编译单元应该包括它自己的声明文件及其代码所涉及的类及函数的声明文件。但这仅仅是惯例,编译器并不强迫

首页 上一页 1 2 3 4 5 下一页 尾页 2/5/5
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇DisigenPattern设计模式 下一篇面试经历(20):千橡互动猫扑

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: