自学Java之二
上回学了import。话说,相比之下C#的using要好用些。比如using可以这么写:
using WindowsForm = System.Windows.Forms.Form; using MobileWebForm = System.Web.UI.MobileControls.Form;
这种写法让一个.cs文件里的名称更简洁。但import显然不能这么灵活。
这次要来学习写一个真正的Hello World程序了。同样说一下C#的写法:
using System;
namespace RobbieTests { public class HelloWorld { public static void Main() { Console.WriteLine("Hello World!"); } } }
简洁明了。直截了当。当然也可以加上string[] args和一个int类型的返回值。然后,跟着Java官方tutorial,来学习一下怎样写命令行上的Hello World程序。
http://docs.oracle.com/javase/tutorial/getStarted/cupojava/win32.html
教程里详细讲了怎样编译及运行这个Hello World。(简化的)源代码如下:
class HelloWorldApp { public static void main(String[] args) { System.out.println("Hello World!"); } }
要保存成HelloWorldApp.java。这一点和C#不一样。C#的源文件名和其中包含的类名可以完全没有关系。它只是会简单地把所有源文件中的类编译出来。而且,C#编译出来的文件,一般是可以把多个源文件编译到同一个dll或exe中去的。Java有所不同,每个源文件(因为类名和源文件名必须相同的缘故,也就相当于每个类)会编译出一个.class文件(我目前的理解是这样的,将来再仔细研究)。
另外,C#在class前面要写public,显式地表示这个类是可以在assembly(也就是包含它的那个dll)的所有程序代码之外访问的。
Java的方法名通常用骆驼命名法(camelCase),不像C#的方法名一般用PascalCase(那是当然啦,C#之父Anders Hejlsberg也是Turbo Pascal之父嘛,不用PascalCase用什么呢?)。但Java的类名通常用PascalCase,比如这里的System。
编译成.class文件以后,就可以运行java HelloWorldApp来编译了。需要指出的是,不要写成java HelloWorldApp.class,否则是跑不通的,会得到一个异常exception in thread ‘main’ java.lang.NoClassDefFoundError。
还有一点就是,main这个函数,C#和Java也很不一样。前面说过,C#里面的Main函数可以加参数和返回值,也可以不加。但Java则要求精确的函数原型匹配:必须加参数,且没有返回值。否则,运行时就会报另一种异常:Exception in thread “main” java.lang.NoSuchMethodError: main。
其实在HelloWorldApp里也可以用package关键字指明它所在的package。比如:
package com.fandecheng.test;
class HelloWorldApp { public static void main(String[] args) { System.out.println("Hello World!"); } }
编译出来之后,把那个.class文件扔到一个叫com\fandecheng\test的子目录(我用的是Windows,所以这里用反斜杠),然后执行java com.fandecheng.test.HelloWorldApp即可。