面向对象读书笔记

合集下载

面向对象个人心得体会

面向对象个人心得体会

面向对象个人心得体会篇一:面向对象的编程总结一、什么是面向对象:所谓面向对象的编程就是:通过封装,继承,多态,把程序的耦合度降低,传统的雕版印刷术的问题就在于所有刻字都在同一版面上造成耦合度太高所致,当用面向对象的模式,使得印刷程序更加灵活,容易修改,并且易于复用。

对象(Object)是类(Class)的一个实例(Instance)。

如果将对象比作房子,那么类就是房子的设计图纸。

所以面向对象程序设计的重点是类的设计,而不是对象的设计。

类可以将数据和函数封装在一起,其中函数表示了类的行为(或称服务)。

类提供关键字public、protected 和private 用于声明哪些数据和函数是公有的、受保护的或者是私有的。

二:基类类与结构体的区别和联系; Strcut test{Private:Int number; Public:Float socre; };类的创建方式和结构体几乎一样, Class test {Private:Int number; Public:Float socre;Public:Public:Int rp();{ Return number;}Void setnum(int a) {Number=a; }}; 但是大家注意到没有,标准c中不允许在结构体中声明函数的,但是在c++中的类中是可以的,这就和c有了本质的区别,很好体现了c++面向对象的特点。

两种语言的区别:过去的c语言是一种面向过程的语言特性是:程序=算法+数据结构但c++的特性是:对象=算法+数据结构;程序=对象+对象+对象。

区别:在c语言中个成员他们的默认存储控制是public 而c++类中默认的存储控制是private.; 上面的rp()事成员函数,如果我们有如下定义: Test a;的话,调用rp()就可以写成: a. rp();成员函数的调用和普通成员的调用方式一致都采用“.”的操作符。

例如: class test {private://私有成员类外不能够直接访问 int number;public://共有成员类外可以直接访问 float socre; public: int rp() {return number; } void setnum(int a) {number=a; } };void main() { test a; //a.number=10;//错误的,私有成员不能外部访问 a.socre=99.9f; cout<<a.socre<<endl;a.setnum(100);//通过共有成员函数setnum()间接对私有成员number函数进行访问 cout<<a.rp(); cout<<endl; }/*int pp=0; class test {private: int number; public: float socre; int pp; public: void rp(); };void test::rp() { ::pp=11; pp=100; }void main() { test a; test b; a.rp(); cout<<pp<<endl; cout<<a.pp<<endl; }*/利用域区分符我们可以在类定义的外部设置成员函数,但要注意的是,在类的内部必须预声明:类型类名 :: 函数名()=值void test::rp()在函数类型的后面加上类的名称再加上域区分符(::)再加函数名称,利用这样的方法我们就在类的外部建立了一个名为rp 的test类大成员函数(方法),可能很多人要问,这么做有意义吗?在类的内部写函数代码不是更好?答案是这样的:在类的定义中,一般成员函数的规模一般都比较小,而且一些特殊的语句是不能够使用的,而且一般会被自动的设置成为inline(内联)函数,即使你没有明确的声明为inline,那么为什么有会被自动设置成为inline呢?因为大多数情况下,类的定义一般是放在头文件中的,在编译的时候这些函数的定义也随之进入头文件,这样就会导致被多次编译,如果是inline的情况,函数定义在调用处扩展,就避免了重复编译的问题,而且把大量的成员函数都放在类中使用起来也十分不方便,为了避免这种情况的发生,所以c++是允许在外部定义类的成员函数(方法)的,将类定义和其它成员函数定义分开,是面向对象编程的通常做法,我们把类的定义在这里也就是头文件了看作是类的外部接口,类的成员函数的定义看成是类的内部实现。

JAVA面向对象总结心得(精选3篇)

JAVA面向对象总结心得(精选3篇)

JA V A面向对象总结心得(精选3篇)JAVA面向对象总结心得第1篇当子类需要父类的功能,而子类有新的内容,可以重写父类中的方法。

在实际开发过程中,随着代码量的逐渐增加,维护成了一个很大的问题,如果需要对某个方法进行修改,其本身代码以及其子类代码都会受到影响,而重写则很好的解决了这个问题。

方法重写又称为方法覆盖、方法复写。

方法签名 = 方法名 + 参数(顺序+类型+个数)当父类和子类的方法签名一致时,我们认为子类重写了父类的方法子类要重写的方法,方法的权限修饰符不能比父类更低(public 、protected 、default 、private 权限依次增加)父类私有的方法,子类不能进行方法重写方法重写:子类和父类中方法相同,两个类之间的关系,函数的返回值类型、函数名、参数列表都一样,当子类继承自父类的相同方法,输入数据一样,但要做出有别于父类的响应时,你就要覆盖父类方法重写发生在运行期,是子类对父类的允许访问的方法的实现过程进行重新编写。

返回值类型、方法名、参数列表必须相同,抛出的异常范围小于等于父类,访问修饰符范围大于等于父类。

构造方法无法被重写方法重载:指在同一个类中,多个方法名相同,他们的参数列表不同(个数不同,数据类型不同),同样的一个方法能够根据输入数据的不同,做出不同的处理方法的重写要遵循“两同两小一大”“两同”即方法名相同、形参列表相同;“一大”指的是子类方法的访问权限应比父类方法的访问权限更大或相等。

关于重写的返回值类型这里需要额外多说明一下,上面的表述不太清晰准确:如果方法的返回类型是 void 和基本数据类型,则返回值重写时不可修改。

但是如果方法的返回值是引用类型,重写时是可以返回该引用类型的子类的。

JAVA面向对象总结心得第2篇封装封装是指把一个对象的状态信息(也就是属性)隐藏在对象内部,不允许外部对象直接访问对象的内部信息。

但是可以提供一些可以被外界访问的方法来操作属性。

面向对象学习笔记

面向对象学习笔记

计算机语言:指由一系列字符组成、具有描述问题的能力、且计算机能识别和执行的代码或指令集发展:机器语言(二进制语言)——汇编语言(符号语言)——高级语言——面向对象语言高级语言结构化程序的思路是:自顶向下、逐步求精面向对象技术是以类与对象为基础,以事件或消息驱动对象执行相关消息处理的程序设计方法面向对象:以数据位中心面向过程:以功能为中心。

因为数据相对于功能而言更具有稳定性面向对象程序设计的特点:面向对象技术具有抽象性、封装性、继承性、多态性等基本特征抽象性:忽略事务中与当前目标无关的非本质特征封装性:指将对象的属性和行为(操作)封装在一起,并尽可能的隐蔽对象的内部细节等特征优点:避免了外部错误对内部属性的影响隐蔽了程序设计的复杂性,提高了代码的重用性,降低了软件开发的难度继承性:特殊类(派生类)的对象拥有一般类(父类)的属性和行为的类与类之间的层次关系多态性:指使用相同方式调用具有不同功能的同名函数的特征C++的多态性:C++多态特征分为编译时多态性和运行时多态性编译时多态:在程序的编译阶段由编译系统根据数据操作或返回值的不同确定需要调用哪个同名的函数运行时多态:在程序的运行阶段才根据程序运行中产生的信息确定需要调用哪个同名函数在C++中编译时多态是通过函数重载和运算符重载实现的;运行时多态是通过继承和虚函数来实现的消息:是描述事件发生的信息,是对象之间发出的行为请求通常一个消息由接受消息的对象、消息的名称、若干消息参数三部分组成事件一般由多个消息组成面向对象软件工程:面向对象的软件工程是面向对象程序设计方法在软件工程领域的全面运用包括:面向对象分析(OOA)任务:确定类与对象、属性;分析对象模式及类对象的关联关系;确定行为要素面向对象编程(OOP)、面向对象测试(OOT)、面向对象软件维护(OOSM)Jave语言是适合网络应用的纯粹面向对象程序设计语言Visual Basic是一种简单的可视化面向对象程序设计语言(具有“所见即所得”的可视化开发环境)C++是一种混合性面向对象程序设计语言(即可用于结构化设计,又可用于面向对象程序设计)类:1、在类的定义中不能对数据成员进行初始化。

面向对象学习感悟

面向对象学习感悟

面向对象学习感悟
在研究面向对象编程的过程中,我对这种编程思想有了一些感悟。

面向对象编程是一种以对象为中心的编程范式,它帮助我们更好地组织和管理代码,并且增加了代码的可重用性和可维护性。

封装
封装是面向对象编程的核心概念之一,它允许我们将数据和相关的方法组合起来,形成一个对象。

封装使得我们可以隐藏对象的内部实现细节,只暴露出对外的接口,提高了代码的安全性和灵活性。

继承
通过继承,一个类可以继承另一个类的属性和方法,从而避免了重复编写相似的代码。

这不仅减少了代码的冗余,还提供了一种灵活的扩展机制。

继承允许我们创建更加复杂的对象关系,使得代码更加易于理解和维护。

多态
多态是面向对象编程的另一个重要特性,它允许我们使用统一
的接口来操作不同的对象,并根据对象的具体类型来执行不同的行为。

多态使得代码更加灵活,可以根据实际需求动态地切换不同的
实现。

设计原则
在研究面向对象编程的过程中,我也了解了一些设计原则,帮
助我们写出高质量的面向对象代码。

一些常见的设计原则包括单一
职责原则、开放封闭原则、里氏替换原则、依赖倒置原则等等。


循这些原则可以使得我们的代码更加灵活、可扩展和易于维护。

结语
面向对象编程是一种强大而灵活的编程范式,通过封装、继承、多态和设计原则等核心概念,我们能够写出结构清晰、易于维护和
扩展的代码。

在以后的研究和实践中,我将更加深入地理解和应用
面向对象思想,为开发高质量的软件做出贡献。

面向对象笔记

面向对象笔记
面向对象
三大特征:
1.封装:类和对象的关系
定义类 class 类名(标识符)
创建对象new 类名()
对象名.成员(属性、方法)
对象的属性不能随便访问(控制访问)
访问修饰符private、无修饰符(默认)、protected、public
用private修饰属性
生成setter and getter方法
this指代当前对象
static:标识的对应的变量的方法和类的方法和变量
流程:jvm装在class类的流程
何时加载:用全局常量时不加载static final
加载顺序:①static标识的属性和方法先加载
②为static属性初始化(包括static块)
③创建对象,先执行代码块,然后执行构造方法
3.多态:方法重写:条件:两同一大两小
形成多态:方法重写
父类引用指向子类对象
应用场景:父类引用作为方法参数
父类引用作为方法返回值
向上转型、向下转型:instanceof
对象引用 instanceof 类型
向上转型 相当于父类引用指向子类对象
向下转型 相当于父类引用强转为子类引用(若不是本对象,则抛出异常)
备注:它们都是是Java多态性的不同表现
都不能被直接实例化,都可以通过继承实现其抽象方法。
* 都是面向抽象编程的技术基础,实现了诸多的设计模式
* 接口支持多继承;抽象类不能实现多继承。
* 接口只能定义抽象规则;抽象类既可以定义规则,还可能提供已实现的成员。
* 接口是一组行为规范;抽象类是一个不完全的类,着重族的概念。
* 接口可以用于支持回调;抽象类不能实现回调,因为继承不支持。

面向对象学习心得体会

面向对象学习心得体会

面向对象学习心得体会面向对象编程是一种非常重要的编程范式,它具有许多优势和特点。

我的研究过程中,我从以下几个方面深刻感受到了面向对象编程的价值和应用:1.封装性(___)面向对象编程通过封装将数据和方法组织在一起,并隐藏实现的细节。

这种封装性使得代码更加模块化和可维护,同时提供了更高的安全性。

在我的研究中,我发现合理的封装可以提高代码的复用性和扩展性,使得我们能够更好地进行团队协作。

2.继承性(Inheritance)继承是面向对象编程中一个重要的特性,它允许我们通过创建一个基类并从中派生出其他子类来实现代码的重用。

在我的研究中,我发现使用继承可以有效地减少代码的重复,提高代码的可维护性和可扩展性。

通过合理使用继承,我们可以快速构建出具有相似功能的类,并且可以通过覆盖和扩展基类的方法来满足特定的需求。

3.多态性(Polymorphism)多态性是面向对象编程中非常有用的特性,它允许我们使用相同的接口来操作不同类型的对象。

通过多态性,我们可以实现更加灵活和可扩展的代码。

在我的研究中,我发现合理使用多态性可以提高代码的可读性和可维护性,同时也可以提高代码的复用性。

4.对象关系在面向对象编程中,对象之间的关系非常重要。

通过正确地建立和管理对象之间的关系,我们可以更好地组织和设计我们的代码。

在我的研究中,我学会了如何使用关联、聚合和继承等不同的关系来实现不同的需求。

这些关系的巧妙运用可以使得我们的代码更加灵活和可扩展。

通过面向对象的研究,我更加清晰地认识到了代码设计的重要性和影响力。

合理地运用面向对象编程的特性,可以使得我们的代码更加模块化、可维护和可扩展。

在未来的研究和工作中,我将继续深入研究并应用面向对象编程的思想和方法。

以上是我对面向对象研究的一些心得体会,希望对同样研究面向对象编程的人有所帮助。

谢谢!。

C#面向对象第二季笔记

C#面向对象第二季笔记

1.面向对象(OOP,Object-Oriented program)不是取代面向过程的。

2.类、对象。

“人”是类,“张三”是“人”这个类的对象。

类是抽象的,对象是具体的。

按钮就是类,某个按钮就是对象。

对象可以叫做类的实例(Instance)。

类就像int,对象就像10。

3.字段Fied(和某个对象相关的变量),字段就是类的状态(不同的对象可能不一样的状态就是字段)。

人这个类有姓名、年龄、身高等字段。

类不占内存,对象才占内存。

4.方法Method(函数),方法就是类能够执行的动作,比如问好、吃饭等。

5类的继承,类之间可以有继承关系,比如“电脑”类可以从“电器”类继承,这样的好处是“电脑”类只需要定义自己特有的字段、方法就可以,也就是只要定义内存大小、CPU型号这些字段或者弹出光驱等方法就可以。

父类(Parent)、基类(Base,基业,祖宗十八代下来的)。

电脑类是电器类的子类(ChidCass)。

重用。

父类有的子类都有。

6.面向对象的三个特性:封装、继承、多态。

7.没有面向对象的世界中的难题。

举例1说明如图成员访问级别1.字段、方法、属性(后面讲)都可以叫做类的成员Member,它们都需要定义访问级别。

访问级别的用处在于控制成员在哪些地方可以被访问,这样达到面向对象中“封装”的目的。

2.几个访问级别:pubic(任何地方都可以访问);private(默认级别。

只能由本类中的成员访问)。

还有interna、protected两个级别,以后会讲。

例2【C#面向对象第二季】第3讲属性1对象的引用(非常重要)i1=3;i2=i1;i1++;//i2是3p1=new Person();p1.i=3;p2=p1;p1.i++;//p2.i是4int、decima、boo、byte、enum等基础类型(值类型)是传递拷贝;对象(引用类型)则是传递引用。

因为基础类型不怎么占内存,而对象则比较占内存。

函数间传递对象。

java面向对象编程的1000字读书笔记

java面向对象编程的1000字读书笔记

java面向对象编程的1000字读书笔记java是面向过程的还是对象的语言所有程序语言的最终目的都是提供一种抽象方法一种较有争议的说法是解决问题的复杂程度直接取决于抽象的e799bee5baa6e79fa5e98193e4b893e5b19e31333335333038种类及质量这儿的种类是指准备对什么进行抽象汇编语言是对基础机器的少量抽象后来的许多命令式语言如FORTRAN BASIC 和C 是对汇编语言的一种抽象与汇编语言相比这些语言已有了长足的进步但它们的抽象原理依然要求我们着重考虑计算机的结构而非考虑问题本身的结构在机器模型位于方案空间与实际解决的问题模型位于问题空间之间程序员必须建立起一种联系这个过程要求人们付出较大的精力而且由于它脱离了编程语言本身的范围造成程序代码很难编写而且要花较大的代价进行维护由此造成的副作用便是一门完善的编程方法学科为机器建模的另一个方法是为要解决的问题制作模型对一些早期语言来说如LISP 和APL 它们的做法是从不同的角度观察世界所有问题都归纳为列表或所有问题都归纳为算法PROLOG 则将所有问题都归纳为决策链对于这些语言我们认为它们一部分是面向基于强制的编程另一部分则是专为处理图形符号设计的每种方法都有自己特殊的用途适合解决某一类的问题但只要超出了它们力所能及的范围就会显得非常笨拙面向对象的程序设计则在此基础上跨出了一大步程序员可利用一些工具表达问题空间内的各种元素由于这种表达非常普遍所以不必受限于特定类型的问题我们将问题空间中的元素以及它们在方案空间的表示物称作对象Object 当然还有一些在问题空间没有对应体的其他对象通过添加新的对象类型程序可进行灵活的调整以便与特定的问题配合所以在阅读方案的描述代码时会读到对问题进行表达的话语与我们以前见过的相比这无疑是一种更加灵活更加强大的语言抽象方法总之OOP 允许我们根据问题来描述问题而不是根据方案然而仍有一个联系途径回到计算机每个对象都类似一台小计算机它们有自己的状态而且可要求它们进行特定的操作与现实世界的对象或者物体相比编程对象与它们也存在共通的地方它们都有自己的特征和行为参考资料:think in javaJAVA零基础者应该看什么书比较好给大家推荐一些对Java学习有用的经典书籍,感兴趣的小伙伴们可以收藏一下1、《thinkingin Java》被称之为Java的圣经的一本书,不建议零基础刚入门的时候看,容易造成学习阴影压力,建议有一定能力以后观看,能学会很多东西,无论什么阶段都能看,都能有不少收获。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

课程设计设计名称:车辆管理系统学校:宁夏大学新华学院系别:信息与计算机科学系专业:网络工程年级:2011级姓名:马丽学号:12011247422指导老师:马子睿车辆管理系统目录摘要 (4)关键词 (4)第一章概述 (5)1.1信息管理系统简介 (5)1.2开发的背景 (5)第二章JAVA语言 (6)2.1 JAVA语言的特点 (6)2.2 C,JAVA.C++的比较 (8)第三章总体设计 (11)3.1 设计目的 (11)3.2 设计任务、要求与思路 (12)3.3 概要设计 (12)第四章系统功能实现 (12)4.1 进入开始界面 (13)4.2 进入录入界面 (16)4.3 进入修改界面 (21)4.4 进入查询界面 (22)4.5 进入删除界面 (25)第五章总结 (26)摘要随着经济的日益增长,信息化时代已经到来,生活中各种信息趋向数字化、清晰化。

车辆管理系统就是在这样的一个环境中诞生的,交通的日益发达,使得一个单位不再是简单的一辆商务车,而是有很多辆车组成,而且车型也不再单一,这使得单位车辆信息复杂化。

因此我们将发挥计算机的庞大的存储空间,高性能的处理能力,高度可靠的数据安全,清晰的可视化数据等这些优势来辅助单位对车辆进行管理,实现了计算机资源的合理利用,真正实现了减少劳动力提高劳动质量的目的。

本文主要分析了系统的主要组成情况,包括需求分析,系统实施和系统主要特点等,重点介绍了系统功能模块的详细思路和实现方法,以及对系统技术和系统的源代码。

关键词:车辆管理,JAVA;第一章概述随着信息技术广泛、深入地应用人类社会的各个领域并发挥着越来越重要的作用。

计算机软件技术应用于信息管理是发展的必然。

作为计算机应用的一部分,充分发挥计算机的优势,将大量复杂的数据交给计算机来处理,有着手工管理所无法比拟的优点。

如:查找方便、可靠性高、存储量大、保密性好、寿命长、成本低等。

这些优点能够极大地提高信息管理的效率,是真正意义上的合理利用资源,也是企事业管理科学化、正规化,与世界接轨的重要条件。

1.1信息管理系统简介管理信息系统,即我们常说的MS(Management Information System),在强调管理,强调信息的现代化社会中变得越来越普及。

MIS是一门新学科,它跨越了若干领域,比如管理科学、系统科学、运筹学、统计学和计算机科学等。

在这些学科的基础上,形成信息收集和加工方法,从而形成了一个复杂的有条理的系统。

目前,由于开发高质量管理信息系统MIS的能力大大落后计算机硬件日新月异的进展,加上社会对管理信息系统MIS发展和完善需求的增加以及对管理信息系统MIS开发过程中出现的错误认识和行为而导致MIS开发的失败,这些情况已严重妨碍了计算机技术的进步。

因此对MIS有关的内容进行深入研究,提高工作效率,提高管理信息系统MIS开发成功率已变得十分重要。

1.2开发的背景信息时代的到来意味着工作功率的日渐提高,同时也给车辆管理部门带来更大的压力,管理部门必须及时准确地提供各种参考材料,若无法作到这一点,将成为企业发展、机构运转的瓶颈。

基于这一原因,车辆管理工作无一例外受到领导的高度重视。

随着车辆资料价值的日渐提升,社会对车辆管理部门也提出了更高的要求,对车辆早已不限于“用好”,更多地要求“管好”,车辆资料管理已向前延伸到公文的管理,向后扩展到信息资源的整理、采编、发放。

就在车辆管理部门职能不断扩大、业务不断扩充的同时,机构改革、企业改制等等政策又要求车辆部门精兵简政,缩减日常经费开支,充分利用现有资源产生更多经济效益。

“向管理要效案例益”已成为车辆部门的运营之本,车辆部门必须提高其自身的管理水平。

“提升车辆管理档次,将车辆交给计算机管理”正在成为一种潮流。

同时,计算机管理突出优势也在影响车辆管理的机制。

以手工检索为目的的著录卡片、目录等,不仅在编制阶段大量占用车辆员的工作时间,检索利用也非常繁琐,缺少经验的车辆员甚至无法在别人编制的目录中查找车辆,更加难以保证“查全率”,使用计算机检索,将彻底解决这一问题。

另外,为了保护车辆资料,造成保管费用高涨,复印机使车辆复制更加简单,却造成纸张消耗量的剧增,同时,大量复制文件的出现又给车辆管理带来新的安全问题,更与车辆管理的严肃性相抵触,使用计算机查询,将纸载车辆管理与电子车辆利用结合起来,可以完美解决这一难题,大幅度降低车辆管理费用。

本系统主要服务于机动管理人员的日常工作,利用本系统可以方便的监控本区域的车主信息,为此基础上力求软件界面人性化及操作简单,程序具有健壮性。

第二章 JAVA语言2.1 Java语言的特点(1)简单性Java 继承了C/C++的语法,丢弃了其中不常用又容易引起混淆的功能,特别是非面向对象的内容,取消了C语言的结构、指针、#DEFINE语句、多重继承、全局变量和函数、GOTO语句、操作符重载和自动类型转换等等。

(2)面向对象Java是一种纯面向对象的语言,具有封装、继承和多态的特性,无全局变量或函数,可以被用于面向对象这种现代软件工程。

(3)分布式Java包括一个支持HTTP和FTP等基于TCP/IP协议的子库。

因此,Java应用程序可凭借URL打开并访问网络上的对象,象本地一样。

(4)解释型Java写成的源代码需要被编译成高阶段的字节码,其与机器架构无关。

然后,这种字节码在任何Java的运行环境中由Java虚拟机解释执行,保证了Java与平台无关性和可移植性。

解释执行与及时编译技术的完美结合,提供了相当高的运算性能。

(5)多态的支持Java是一种非常注重对象形态转换的语言,所以在编译时期就会做形态转换检查,在执行时期,Java也会做一些形态上的检查。

(6)垃圾收集和异常处理由于Java垃圾收集器会做自动的垃圾收集,这里的垃圾指一些不会被使用的对象,所以程序设计者不需费心,内存会被自动地管理,Java本身提供了许多面向对象的异常处理,所以程序在执行时期所发生的错误,都可以由程序自己来处理。

(7)安全性Java设计时对系统的安全,特别是网络安全做了周密的考虑。

通过字节码验证、内存调用方式、资源使用权限等进行多层次的安全管理。

Java被认为是在任何系统上最安全的应用程序之一。

2.2c、 java 、c++的比较现在最有前途的一般认为是java和c#如下面所述:C#诞生之日起,关于C#与Java之间的论战便此起彼伏,至今不辍。

抛却Microsoft与Sun之间的恩怨与口角,客观地从技术上讲,C#与Java都是对传统面向对象程序设计在组件化软件时代的革新之果,可谓殊途同归。

虽说两个语言有着"90%的重叠",但那另外"10%的较量"也往往能够左右一个天平的方向。

本文将携90%之共,论10%之异,对两个语言做纯技术品评。

文章不涉及两个语言的公司,市场等台面后的事情--虽然这往往也会影响人们对编程语言的选择。

也不预备得出谁是谁的Killer,读者应该选择谁的问题。

"语言选择乃艺术而非技术问题",业界早有定论,无需多言。

C#和Java都提出了对传统C++艰深,晦涩的语法语义的现代改良。

在语法方面,两者都摈弃了C++中函数及其参数的const修饰,宏代换,全局变量和全局函数等许多华而不实的地方。

在继承方面,两者都采用了更易于理解和建构的单根继承和多接口实现的方案。

在源代码组织方面,都提出了声明与实现于一体的更好的逻辑封装。

在类型系统方面,两个语言都在中间语言IL或字节代码的基础上提出了映射(Reflection)这样的概念,彻底革新了传统C++运行时类型鉴别的问题。

但在大刀阔斧地对C++进行改革的同时,C#显得更为保守,它对很多原来C++中很好的性质予以了保留,如基于栈分配的轻量级的结构类型,枚举类型,引用(ref),输出(out),数组(params)修饰的参数传递方式等,这些在Java中都被很可惜地丢掉了。

在基本类型和单根继承的对象之间的类型统一方面C#提出的box/unbox要比Java的包装类显得高明,效率也要好。

对C++不安全的指针及内存分配方式,C#和Java都提出了托管执行环境。

效率问题是托管执行环境一直以来令人诟病的地方,Java虚拟机(JVM)的解释执行方式曾经让很多开发者"慢的不可忍受"。

C#的JIT编译方式为C#在这块战场上赢得赞声一片,某些C#托管代码甚至比传统C++代码都快。

虽然现在各厂商实现的Java平台也都一致地采取了JIT编译方式,但C#在这方面的比较优势非常明显--C#的目标编译语言IL从设计初始就把效率摆在了重要的地位,而Java的字节代码的设计却有些鲁莽。

托管执行环境经过几年的实践,在现代软件界已经达成了共识,效率的牺牲换来的是高度安全的代码--当然前提是牺牲的效率必须足够的小,至少可以忍受。

值得指出的是在这里C#同样"念念不忘老一辈C++程序员",C#允许我们在unsafe上下文中进行指针操作。

数组的索引越界检查,类型安全在C#和Java中都被提到了相当的高度。

在异常处理方面,不管从内置支持,还是从执行效率来讲,C#都较Java略胜一筹。

"一次编程,多处执行"是程序设计一直以来的一个诉求,尤其是在现代互联网络时代。

在跨平台方面,Java的支持和实现都是为人称道的,虽然JVM的速度仍然让人备感头疼。

而C#虽然在底层构造方面对移植性进行了充分的考虑,但至少目前还没有成熟的,经过检验的产品。

C#在跨平台方面似乎更热衷于XML Web Services互操作,而不是跨平台编程。

但C#通过其基础语言构造(CLI)对二十多种主流语言的对象级的互操作支持,又极大地提升了C#的技术地位。

和COM组件廉价地互操作也为C#挣到不少分数--保持一个兼容的体系对现代软件工业非常重要,也是对广大开发人员负责任的表现。

面向组件无疑是当代软件开发的主流。

C#对组件编程甚至到了"迷恋"的地步,这与6年前就出道的Java不可同日而语--当然这是时代问题。

C#通过属性,索引器,委派,事件,操作符重载,特征,版本等实现了其对组件编程的第一手的支持。

虽然这些在Java中都可以通过方法,接口或者适配器来间接地实现,但软件业的历史告诉我们这无论对编程效率或者逻辑设计都是一种极大的损伤--高级语言首先面对的是人,而不是机器。

除去这些语言层面的组件支持机制,.NET平台也为组件的配置,运行,管理等提供了一揽子解决方案,而为组件开发量身定做的Visual 更是令人兴奋,这都为C#的组件编程开辟了广阔的天地。

在其他技术方面Java的微弱劣势尚且可以忽略不计,但在组件编程方面Java相较于C#却有着不可治愈的硬伤。

相关文档
最新文档