真正让C#家伙熟练使用Java-ME的最佳方法
我最近开始为Blackberry开发应用程序。因此,我不得不跳到Java-ME并学习该语言及其相关工具。语法很简单,但是我仍然遇到各种陷阱和环境问题。
例如,令我惊讶并浪费大量时间的是类对象上缺少实际属性(我以为所有OOP语言都具有这种属性)。有很多陷阱。我去过很多地方,他们将Java语法与C#进行了比较,但是似乎没有任何网站可以说明在迁移到Java时需要注意的事情。
环境是另一个整体。 Blackberry IDE简直太恐怖了。外观使我想起了Windows 3.1的Borland C ++,它已过时。其他一些问题还包括斑点的智能感知,弱调试等。Blackberry确实具有Eclipse插件的beta版本,但是没有调试支持,它只是一个带有精美重构工具的编辑器。
那么,关于如何融入Java-ME的任何建议?
解决方案
简短的答案是,这将很烦人,但并不困难。
Java和Chave都是相同的基础概念,并且许多库的样式都非常接近,但是我们将不断遇到各种差异。
如果我们在谈论类属性,则Java具有那些。语法是
public class MyClass { public static int MY_CLASS_PROPERTY = 12; }
我会严重建议我们获得更好的IDE。
Netbeans,Eclipse,IDEA,JBuider中的任何一个都将使过渡更加愉快。
这个家伙在这里必须进行逆转换。因此,他列出了Java和C#的十大区别。我将讨论他的主题,并展示它是如何用Java制成的:
陷阱#10-给我我的标准输出!
要使用Java打印到标准输出,请执行以下操作:
System.out.println("Hello");
陷阱#9-命名空间==自由
在Java中,我们没有命名空间的自由。类的文件夹结构必须与程序包名称匹配。例如,包org.test中的类必须位于org / test文件夹中
陷阱#8-超级发生了什么?
在Java中,要引用超类,请使用保留字super
而不是base
。
难题#7-将构造函数链接到基本构造函数
我们在Java中没有这个。我们必须自己调用构造函数
难题#6-Dagnabit,我该如何继承现有的课程?
要在Java中子类化,请执行以下操作:
public class A extends B { }
这意味着类" A"是类" B"的子类。在C中将是A类:B类
难题#5-为什么常数不保持常数?
要在Java中定义常量,请使用关键字final
而不是const
难题#4-" ArrayList"," Vector"或者" Hashtable"在哪里?
Java中最常用的数据结构是" HashSet"," ArrayList"和" HashMap"。他们实现了"设置","列表"和"地图"。当然,还有更多。在这里阅读有关收藏的更多信息
陷阱#3-存取器和变异器(字母和二传手)
我们没有Java中的属性工具。我们必须自己声明gets和set方法。当然,大多数IDE都可以自动执行此操作。
陷阱#2-我无法覆盖!?
我们无需在Java中声明方法virtual
。除了那些声明为" final"的方法外,所有方法都可以在Java中覆盖。
和#1陷阱
在Java中,原始类型int,float,double,char和long与C#中的Object不同。它们都有各自的对象表示形式,例如" Integer"," Float"," Double"等。
而已。不要忘记查看原始链接,这里有更详细的讨论。
Java与C#并没有太大区别。在纯粹的语法层面上,以下是一些可能使我们精通一天的指针:
- 在Java中,有两个异常家族:
java.lang.Exception
和由此派生的一切,以及RuntimeException
。这很有意义,因为在Java中检查了异常。这意味着,为了抛出任何非运行时异常,我们还需要在方法声明中添加" throws"注释。因此,使用方法的任何方法都必须捕获该异常或者声明它也引发相同的异常。实际上,很多异常(例如NullPointerException或者IllegalArgumentException)都是从RuntimeException派生的,因此我们无需声明它们。受检查的异常是两个学科之间的争论点,因此,我建议我们自己尝试一下它们,看看它是否有帮助或者使我们烦恼。从个人的角度来看,我认为检查异常可以显着改善代码分解和健壮性。 - 尽管Java支持自动装箱已经有一段时间了,但是我们应该意识到C#和Java实现之间仍然存在许多差异。在C#中,我们可以将
int
作为值类型和引用类型互换使用,而在Java中,它们实际上不是同一类型:我们获得原始值类型int'和库引用类型
java.lang.Integer `。这以两种常见的方式表现出来:不能将值类型用作通用类型参数(因此,将使用" ArrayList <Integer>"代替" ArrayList <int>")和实用程序方法(例如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 <Integer>"和" ArrayList <String>"是等效的。如果我们大量使用泛型,则会比我们想象的要早得多地遇到这些差异。
我认为,对于开发人员而言,语言的三个最难方面。除此之外,还有开发工具和类库。
- 在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中的静态类不同,即使它们具有相同的名称并且共享相同的代码库也是如此。 AppDomain在.NET中提供了一些相似的功能。
- Java类库类似于BCL。许多差异都是外观上的差异,但这足以使我们一次又一次地运行文档(和/或者Google)。不幸的是,我认为这里没有任何事情可做,我们可以在使用过程中逐渐熟悉这些库。
底线:使用Java是唯一的方法。学习曲线并不陡峭,但是在使用的前两三个月中经常会感到惊讶和沮丧。