下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、.;Java和C#、C/C+的比较最近在看Java,但我之前已经有了一年多C#开发的经历了。以前听人说C#是怎么抄袭Java的语法,但最近自己的亲身受就是C#是“拿来”了Java的很大一部分的思想,但觉得创新和改进也是不少的。本人也只是一个菜鸟,下面是本人随便写的一些东西,不具备权威性啊。1.Java的面向对象,具体点说,就只有Primitive Type(原始类型)、Obejct(对象)、Object的Field(字段)和Obejct的Method(方法)这些可以操作的实际内容了。相对来说,我觉得C#面向对象的内容要完善得多,C#中的对象可以拥有的东西可以有Field(字段)、Propert
2、y(属性)、Method(方法)、Event(事件)、Delegate(委托)等。这比较符合现实的对象,C#可以对属性像变量一样赋值和取用,但内部同时可能会引发相关的操作,而不用像Java得使用get/set函数既不直观形象,也很麻烦。还有Java就没有过事件这一说,但实际上事件在对象上时刻是发生的,C#中为对象增加了事件一概念,可以保证对象上发生的事件能够被感兴趣的对象接收得到。2.Java没有运算符重载。3.Java中派生类必须显式调用基类的带参构造函数(如果它只有带参构造函数的话)。并且写法是写在派生类构造函数的第一行。还有,同一个Java类的构造函数在相互调用时,也是在调用的构造函数体
3、的第一行写上被调用构造函数语句。并且每个类的构造函数需且仅需调用该类其他构造函数或基类构造函数一次且仅一次。省略不写的时候,默认调用其基类的无参构造函数。如果其基类没有无参构造函数,就必须显式调用基类的有参构造函数,否则会出现错误。C#中,对构造函数调用的规定同Java,但其写法和类之间继承的写法类似,虽然没有必然关系,还是容易让人联想到,类只允许继承自一个基类,所以类的每个构造函数也只能调用一个构造函数。语法是在构造函数的定义的括号后面加冒号(:)再加base(argments)(对基类构造函数的调用)或this(argments)(对自身构造函数的调用)。如derivedClass(arg
4、s):base(argments)这样的话,c#中不存在构造函数放错位置和多次调用的错误。4.Java类中的静态成员可以用实例名去访问,也可以用类名去访问,但是C#中规定只能由类名去访问。在这一点上,感觉C#要考虑得要更周到一些。毕竟有些属性是属于类而不属于实例的。5.接口的定义与使用,区别如下:(1)Java中,虚方法前面可以添加public和abstract关键字(虽然加与不加效果是一样的),C#强制,方法前面什么都不能加。其效果都是public和abstract。(2)Java中,可以在接口中定义字段,这些字段都是static和final的(无论是否加这些关键字),所以是只读的。其字段的
5、值要在定义的时候初始化。但C#中的接口不允许有字段的定义,可以说在应用上,算是一个不足吧,但这样可能会提高编译和运行的效率。但C#的接口中可以定义属性(实际上还是函数而已)。(3)如果一个类实现了两个接口,而恰巧两个接口中含有相同签名(不包括返回类型)的方法,二者返回类型相同或者不同。对于前种情况,Java中只会对两个接口中相同签名的方法实现一次,而且无论你是用类来调用,还是转型为两种接口来调用,调用到的都是同一个函数。对于签名名相同,返回类型不同的情况,Java中是无法实现这两个接口的。因为无法对虚函数进行覆写。而对于这两种情况,C#都是有实现方法的,它在实现两个接口虚函数的时候,对相同签名
6、的虚函数名前面加上接口的类型名,形成如:interfaceName.methodName(argument list)这样的实现形式,我们把这种形式叫“变形”吧。当然可以选择对其中的一者或者两者都进行这种变形。反正能够区别二者就行了。这样造成的结果就是,对“变形”函数的调用,不能再通过类的实例名来调用了,而是要转型为接口之后才能调用。这也就解决了动态绑定的不确定性问题啊!(4)Java中接口可以内嵌在class中,也可以嵌套在interface中。但c#只允许接口嵌套在class中,不能嵌套在其他interface中。6.关于类型可见性,尤其在内隐类和嵌套接口的使用中,Java采用较为开放的策
7、略,对“扩大”可见性的行为,编译器并不禁止,但是往往会导致有些方法或属性因为类型不可见而不可用。但是C#完全采用严格限制的做法,低访问级的类型不能暴露给高访问的对象。这样可以保证所有可见的方法和属性始终是可用的。比如:class A private class B /Implementation public B getB() return new B(); 其中getB函数,在Java中能够通过编译,但在类中是无法正常应用的。但在C#中是不能正常通过编译的。7.Java中有所谓的初始化块,即有静态初始化块和实例成员初始化块,但是C#中没有。Java中的初始化块的样子就像下面这个样子:clas
8、s A int xx; static int yy; /下面就实例初始化块 xx = 56; System.out.println(Instance initialization!); /下面是静态初始化块 static yy = 323; System.out.println(static initialization!); 每个类可以有多个实例和静态初始化块,其运行分别是在静态和实例成员初始化时进行的,顺序和是按成员出现的顺序。8.内隐类与匿名类:(1)Java中有匿名类,但是C#没有;(2)Java中的内隐类分成两种:静态内隐类和非静态内隐类。其中非静态内隐类可以访问外覆类的所有成员,包括实例成员,但它不能有静态成员。这也就决定了非静态内隐内是要由外覆类的实例产生的。比如A类中有内隐类B。则B的实例化语法就是:A.B b = (new A().new B();或者写成:A a = new A();A.B = a.new B();语法是不是很奇怪啊!一般Java不用这种语法来产生非静态内隐类,而是在外覆类中用一个特定方法,在这个方法中实例化非静态内隐类,然后以内隐类的父类的类型或是其某一个接口的类型返回之。这样达到封
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 水渠工程施工合同范本
- 护栏安装合同
- 二零二五年标准商业保理业务担保合同样本3篇
- 二零二五版房屋买卖合同付款进度与方式3篇
- 2025年度能源领域首席安全官(CSO)聘用合同
- 离婚协议抚养权
- 2025年度地铁设施日常维护检修合同规范2篇
- 产品设计委托合同协议书范本
- 二零二五年度综合性spa馆加盟经营合同
- 培训班合伙协议合同范本
- 直播带货助农现状及发展对策研究-以抖音直播为例(开题)
- 腰椎间盘突出疑难病例讨论
- 《光伏发电工程工程量清单计价规范》
- 2023-2024学年度人教版四年级语文上册寒假作业
- (完整版)保证药品信息来源合法、真实、安全的管理措施、情况说明及相关证明
- 营销专员绩效考核指标
- 陕西麟游风电吊装方案专家论证版
- 供应商审核培训教程
- 【盒马鲜生生鲜类产品配送服务问题及优化建议分析10000字(论文)】
- 肝硬化心衰患者的护理查房课件
- 2023年四川省乐山市中考数学试卷
评论
0/150
提交评论