任务:你所在的公司是一家美国的服装设计和制造公司,现在这家公司打算进入欧洲市场,于是需要一个将英制单位(英寸)换算为公制单位(厘米)的程序。已知1英寸=2.54厘米,该程序输入以英寸为单位的长度,显示该长度对应的厘米数。例如:输入英寸:2.5,输出:2.5英寸=6.35厘米。
package com.lovo;
import java.util.Scanner;
public class MyConverter {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.print("输入英寸: ");
double inch = sc.nextDouble();
System.out.println(inch + "英寸 = " + inch * 2.54 + "厘米");
sc.close();
}
}
上面是用Java语言书写的完成任务一的代码。Java是在1995年的5月23日诞生的一种面向对象的编程语言。1991年的时候,SUN公司(太阳微系统公司[美国],2009年被Oracle公司[美国]收购)成立了一个名为Green的项目组致力于机顶盒(实现视频点播)的开发,但是机顶盒的概念在当时过于超前不被大众所接受,项目并没有取得预期的成功。虽然项目失败了,然而在项目开发过程中使用的一种运行于虚拟机上的新语言Oak却被保留下来,这就是后来的Java(因为Oak已经被美国的另外一家公司进行了商标注册)。1996年,Java的第一个版本正式发布,此后Java受到了极大的关注和追捧,因为从一开始它就是一个和互联网一起成长起来的语言,而且是一项自由(free)的技术。从2004年到2013年,Java一直占据着TIOBE发布的编程排行榜第一名的位置(
TIOBE官网)。
下面是Java语言的编年史:
• 1995:Java诞生
• 1996:第一个正式版本JDK 1.0发布
• 1998:JDK 1.2发布,称之为Java 2,引入Swing
• 1999:JDK 1.3发布,Java平台分为标准版(J2SE)/ 企业版(J2EE) / 微缩版(J2ME)
• 2000:JDK 1.4,引入断言、NIO
• 2001:Nokia推出首款支持Java的手机
• 2004:JDK1.5发布,称为Java 5,引入了很多重要的语言特性
• 2006:Java 6发布,Java SE / Java EE / Java ME
• 2009:SUN公司被Oracle收购
• 2011:Java 7发布
• 2014:Java 8发布
在上面的代码中,我们创建了一个名为MyConverter的类(class),在面向对象的程序设计中,类是最为重要的程序构件。MyConverter类以左花括号开始,右花括号结束,其中定以了一个名为main的方法,该方法被称为可执行程序的入口,也就意味着,程序从main方法开始执行,直到main方法结束,这一点跟C和C++(另外两种占据统治地位的编程语言)一致。main方法也是以左花括号开始,到右花括号结束,中间的部分被称为方法体。在方法体中,首先创建了一个Scanner(扫描器)对象sc,该对象用来读取用户从键盘输入的内容;接下来,通过System类(这个类是Java中自带的类,提供了很多有用的属性和方法)的out成员的print方法在控制台打印“输入英寸:”给用户以提示;然后,我们定义了一个double类型的变量inch(相当于在内存中预留了一个可以存储小数的区域),并将从Scanner中读取到的小数(通过Scanner对象的nextDouble方法获得)存储到该变量中;接下来通过乘法运算可以计算出英寸对应的厘米,然后再次使用System.out.println方法将计算的结果打印在控制台,打印的是一个字符串,这个字符串由多个部分构成,因此用+将多个字符串拼接在一起;最后用Scanner对象的close方法关闭扫描器,程序结束。
注意:main方法的前面有三个修饰符,分别是public、static和void。其中,public表示该方法是公开的,主要是为了让Java虚拟机(之前我们提到了Java是一种运行在虚拟机中的语言,虚拟机是一台假想的计算机,它有自己的处理器、内存等虚拟硬件并定义了相应的程序指令,然后可以执行这些程序指令)中的对象都能够访问它,而static表示main方法在内存中是唯一的(因为程序的入口只有一个),而void则表明main方法执行结束后不需要向它的调用者反馈任何信息。当然,如果你暂时不能理解这几个修饰符也不要紧,后面的章节会有更详细的讲解。另外,程序的第一个行package是建包语句,意思是创建com文件夹和lovo子文件夹并将类放在文件夹(包)中管理起来,这是一种管理类以及避免名字冲突(在不同的包中可以有同名的类)的有效手段。下面的import则是导入某个包中的类,由于程序中使用的Scanner类并不在java.lang包(唯一一个不需要显式导入的包)中,而是在java.util包中,因此需要用import先导入,后面才能使用它。
在上面的代码中,为了保存用户输入的小数,我们定义了一个double类型的变量。除了double类型,Java中还定义了其他七种基本数据类型(byte、short、int、long、float、char、boolean),用来表示最常用的整数、小数、字符和布尔值(只有true和false两种取值,分别表示逻辑真和假)。除了这八种基本数据类型,其他的基本都是对象类型,例如上面程序中的Scanner,对象类型可以用来引用一个对象,后面的代码中我们会看到更多的对象类型,毕竟Java是面向对象的程序设计语言。
好了,还没有告诉大家如何运行上面的这段代码。作为一个Java的开发者,你需要JDK(Java开发者工具),JDK可以通过Oracle公司的官网获得。不管你使用哪种操作系统,安装完成后,你都可以在JDK的安装目录下找到一个bin目录,该目录中包括了Java的编译器和解释器,当然还有其他很多重要的开发工具。Java是一种先编译再解释执行的语言,我们刚才书写的那段内容称为Java的源程序,我将它命名为MyConverter.java。Java有一个要求就是文件名必须跟被public修饰的类的类名完全保持一致,包括大小写。通过Java的编译器(javac命令),可以将MyConverter.java编译生成MyConverter.class类文件,类文件中是一种被称为字节码(byte-code)的中间代码,这种中间代码人类无法理解,计算机也无法理解(因为计算机只认识0和1组成的指令),但是Java虚拟机可以读懂它,于是通过启动Java虚拟机(java命令)来解释执行刚才的字节码就可以看到程序运行的结果。如果源程序中存在错误,那么在编译时编译器会给出错误提示;通过编译的程序在运行的时候仍然可能出现意想不到的问题,这时可以使用调试器(jdb)去调试程序,发现并修复程序中的bug(程序中的缺陷通常被称为bug,因为计算机历史上的第一次运行故障是由一个臭虫(bug)让电子管烧毁所引发的)。关于程序的调试,我们在后面再为大家详细介绍。
下面的图为大家展示了用JDK提供的工具编译和运行上面的代码的情况:
为了在命令行可以使用javac和java命令,需要在安装JDK之后配置环境变量,具体的安装和配置方法你可以谷歌一下或者百度一下,so easy。如果不清楚javac和java的具体用法以及命令参数,也可以问一下谷老师和百老师。
当然,为了提高开发效率,我们不可能一直使用这种方式来编译和运行Java程序,我们可以使用IDE(集成开发环境)。在所有的Java IDE中,最有名和使用率最高的两款IDE应该是IBM重金打造并送给开源社区的Eclipse以及JetBrains开发的IntelliJ,如下图所示:
Eclipse:
IntelliJ: