JAVA和.NET开发过程中的一些不同

Java语言和C#语言非常相似,虽然内部会有很多区别,提供的API也不一样,但开发一个具体功能点的思路常用的都差不多,由于对比较新的技术和特性开发过程中接触不多,我所遇到的不同点包括:

 

1、Java包的名字是和物理文件位置一一对应的, C#里命名空间可以随便写,并且编译出来的程序集也可以随便更改,可以不和命名空间保持一致,程序集和JAVA里单独打出来的jar包是差不多的意思。

2、JAVA的一个文件只能有一个公共类,而C#可以多个公共类在一个文件里。

3、如果找到一个JAR包,Java查看新jar包的方法字段描述,需要有单独的对应jar包的doc文档,才能看到接口调用参数说明,否则看起来不直观,但是如果有源码打出来的jar包,调试的时候可以方便的看到该包的源代码。.NET里只要有了dll文件,就能方便的看到方法元数据调用参数,但是看到参数详细说明,还是需要对应dll的xml文档。

4、对于WEB开发,JAVA里Filter,Servlet,Listener是很常用的,Java里的Filter可以用.NET里的module来实现一些功能,但Filter可以制定作用请求范围,module是全局控制的;Servlet相当于一个具体的handler,可以对制定请求进行处理,Listerner可以用.NET里的Application_Start里来完成一些功能,但是JAVA里集成了部分默认Listerner,它在WEB应用启动的时候就开始执行。它们的具体执行流程为:WEB启动时,Listener的ContextInitialized方法->所有Filter的Init(不管filter-mapping的值)->所有配置了load-on-startup大于等于0的Servlet的init方法(不管servlet-mapping的值),具体请求为:具体Servlet的init(只执行一次)->Filter doFilter(请求配置的filter-mapping的value)->Servlet service; 最后网站释放的执行顺序为:Filter destroy-》Listener contextDestroyed。

5、Java里的Final关键字,当给一个字段时,表示该字段不能修改,构造函数里都不能修改,这个和C#的const有点像,但是const默认是static的。和C#的readonly也比较像,但是readonly可以在构造函数里修改。当它作为一个方法的修饰符时,它类试c#的sealed类,不能重写它。

6、Java里没有静态构造函数,如果要实现一些初始化工作,需要用静态代码块,static{…},里面输入内容即可,C#只有静态构造函数的说法。

7、JAVA中有常量池概念,是和堆、栈不一样的区域,虽然和C#一样String都有字符串驻留机制,但是和.NET的又不一样了。因此java里字符串比较最好用equals比较,否则可能出问题。比如"a"+"b"字符串在常量池里,如果它们和”ab”比较将相等,但是"a"+b,b是一个变量,就将放到堆里了,如果还用==”ab”判断将返回false,所以JAVA里尽量用equals来判断字符串,但是.NET里不涉及这个问题,经过计算的字符串,==的结果也会相等。

8、Java里每个文件只要有Main方法入口,它都可以运行,而.NET里需要项目类型修改为控制台应用程序,然后有一个Main方法才能作为一个运行的载体。

9、Byte类型的数字范围不一样,Java里是-128到127,.NET是0-255,一般需要互相交换数据和处理都是转换成16进制,然后取8bit的后2个bit,这样它们的值都是一样的,方便同步加密解密或相关处理

10、Java里推荐用get,set方法来对内部变量赋值和获取值,.NET里可以用字段get,set获取,并且vs2008后可以直接get;set;的方式,借助语法糖,编译器后会自动生成等价的get,set内部字段。

11、JAVA里文件保存后默认自动编译,但是这个也得益于它把每个java文件编译成一个class文件,.NET里需要单独每次执行编译项目,因为它一个项目一个dll文件,如果保存其中一个.cs文件都执行编译,则工作量太大影响开发速度。

12、Java里List是一个接口,这个对在C#里用惯了List集合的,new List已经会报错了,而且它们的泛型也不一样,C#是CLR层的泛型支持,JAVA的泛型不是经过JVM支持的,因此性能相对没有提升。

13、JAVA里默认修饰符是包内可见(对应同一个文件夹目录,而不是项目大jar包下)的, protected的变量和方法都是包内和子类可见的,.NET里是只有自己和子类可见。.NET里类的默认修饰符是Internal,程序集内可访问。方法和字段默认为private的,和JAVA默认包内可见不一样。
已邀请:

要回复问题请先登录注册