自学Java之二

2014年10月14日

上回学了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即可。

留下您的评论