我最近开始为Blackberry开发应用程序.因此,我不得不跳到Java-ME并学习它及其相关工具.语法很简单,但我一直遇到各种问题和环境问题.
例如,让我感到惊讶并且浪费了很多时间的事情是在类对象上缺少真正的属性(我假设所有的OOP语言都有).有很多陷阱.我去过各种比较Java语法和C#的地方,但似乎没有任何网站可以告诉你在迁移到Java时需要注意的事项.
环境是一个完整的另一个问题.Blackberry IDE简直太糟糕了.外观让我想起了Windows 3.1的Borland C++ - 它已经过时了.其他一些问题包括斑点智能感知,弱调试等......黑莓确实有Eclipse插件的测试版,但没有调试支持,它只是一个带有花哨的重构工具的编辑器.
那么,关于如何融入Java-ME的任何建议?
这家伙不得不做出逆转换.所以他列出了Java和C#的十大差异.我将讨论他的主题,并展示它是如何用Java制作的:
要打印到Java中的标准输出:
System.out.println("Hello");
在Java中,您没有命名空间的自由.类的文件夹结构必须与包名称匹配.例如,包org.test中的类必须位于org/test文件夹中
在Java中引用超类,您使用保留字super
而不是base
你没有Java中的这个.你必须自己调用构造函数
要用Java子类化类,请执行以下操作:
public class A extends B { }
这意味着class A
是类的子类B
.在C#中会是class A : B
要在Java中定义常量,请使用关键字final
而不是const
ArrayList
,Vector
或Hashtable
?java中最常用的数据结构是HashSet
,ArrayList
和HashMap
.他们实施Set
,List
和Map
.当然,还有更多.在这里阅读更多关于收藏
您没有Java中的属性工具.你必须为自己声明gets和sets方法.当然,大多数IDE都可以自动完成.
您不必virtual
在Java中声明方法.所有方法 - 除了声明的方法 - final
都可以在Java中重写.
在Java的原始类型int
,float
,double
,char
和long
是不是Object
就像在C#.所有这些具有各自的对象表示,如Integer
,Float
,Double
等.
而已.不要忘记看原始链接,有更详细的讨论.
Java与C#没有显着差异.在纯粹的语法层面,这里有一些指导可能会让你度过一天:
在Java中,您有两个异常系列:java.lang.Exception
以及从中衍生出来的所有异常,以及RuntimeException
.这很有意义,因为在Java中检查异常; 这意味着为了抛出任何非运行时异常,您还需要throws
在方法声明中添加注释.因此,使用您的任何方法都必须捕获该异常或声明它也会抛出相同的异常.您认为很多例外是理所当然的,例如NullPointerException
或者IllegalArgumentException
实际上来源于RuntimeException
因此,您不需要声明它们.被检查的例外是两个学科之间的争论点,因此我建议您亲自试用它们,看看它是否有助于或惹恼您.在个人层面上,我认为已检查的异常会显着改善代码分解和健壮性.
虽然Java已经支持autoboxing很长一段时间了,但是你应该注意的C#和Java实现之间仍然存在很多差异.而在C#中,您可以互换地使用int
值类型和引用类型,而在Java中它们实际上不是同一类型:您获得原始值类型int
和库引用类型java.lang.Integer
.这表现在两种常见方式:您不能将值类型用作泛型类型参数(因此您将使用ArrayList
而不是ArrayList
),并且实用方法(例如parse
或toString
)在引用类型中静态实现(因此它不是int a; a.toString();
而是int a; Integer.toString( a );
).
Java有两种不同类型的嵌套类,C#只有一种.在Java中,未使用static
修饰符声明的静态类称为内部类,并且具有对封闭类的实例的隐式访问.这是一个重要的观点,因为与C#不同,Java没有委托的概念,并且内部类经常用于在相对较少的语法痛苦下实现相同的结果.
Java中的泛型以与C#完全不同的方式实现; 当为Java开发泛型时,我们决定在没有运行时支持的情况下进行纯粹的语法修改,以保持与旧VM的向后兼容性.由于运行时没有直接的泛型支持,Java使用称为类型擦除的技术实现泛型.在泛型的C#实现上键入擦除有很多缺点,但最重要的一点是Java中的参数化泛型类型没有不同的运行时类型.换句话说,编译之后的类型ArrayList
和ArrayList
是等价.如果你大量使用泛型,那么你会比你想象的更快地遇到这些差异.
在我看来,对于C#开发人员来说,语言有三个最难的方面.除此之外还有开发工具和类库.
在Java中,包(命名空间),类名和文件名之间存在直接关联.在一个公共的根目录下,类com.example.SomeClass
和org.apache.SomeOtherClass
将分别在com/example/SomeClass.class
和中找到org/apache/SomeOtherClass.class
.要小心尝试在单个Java文件中定义多个类(这可能是私有类,但不推荐),并坚持使用此目录结构,直到您对开发环境更加满意为止.
在Java中,你有类路径和类加载器的概念,它们不容易映射到C#(大多数.NET开发人员都没有普遍使用的粗略等价物).Classpath告诉Java VM在哪里找到库和类(包括你的和系统的共享库!),你可以将类加载器视为类型所在的上下文.类加载器用于从各个位置(本地磁盘,Internet,资源文件,诸如此类)加载类型(类文件),但也限制对这些文件的访问.例如,诸如Tomcat之类的应用服务器将为每个注册的应用程序或上下文提供类加载器; 这意味着应用程序A中的静态类与应用程序B中的静态类不同,即使它们具有相同的名称,即使它们共享相同的代码库.
Java类库类似于BCL; 很多差异都是装饰性的,但它足以让你一遍又一遍地运行文档(和/或谷歌).不幸的是,我认为这里没有任何事情要做 - 你只需要熟悉图书馆.
底线:了解Java的唯一方法就是使用它.学习曲线并不陡峭,但在使用的前两三个月内,经常会感到惊讶和沮丧.