Java程序员面试秘笈
上QQ阅读APP看书,第一时间看更新

第1章 Java编程基础

通过考察Java编程基础,用人单位可以了解求职者对Java语言的理解程度和熟练程度,一个熟练、具备开发经验的程序员,可以轻松地解答相关问题。而对于刚刚准备步入职场的新人,由于基础不扎实,准备不充分,Java基础编程方面的面试题往往会给他们造成一定的困扰。值得注意的是,企业和学校对Java基础考察的方向有很大的不同,往往求职者对哪些编程基础必须掌握没有一个清醒的认识,不知道企业需要考察哪方面的知识,这样会失去很多可贵的机会。

本章通过真实的试题,从多个角度讲解Java编程基础部分的考点,使求职者能够快速领会用人单位的需求,提高自己在应聘中成功的几率。

求职者需要熟练掌握以下知识点。

• Java的安装与调试,重点是Java环境的配置。

• Java开发中基本术语和基本概念。

• 理解类、对象、引用、变量、方法和成员。

• 熟练掌握Java的调试和运行。

• 了解和掌握常用的Java开发工具。

面试题1 简单描述Java开发包的种类

考点:考察求职者对于Java体系的认识,属于Java程序员的必备知识。

出现频率:★★★

面试题解析】随着Java语言的成长和壮大,Java的开发包根据用途的不同已经分为Java EE、Java SE和Java ME 3个开发包,求职者需要列出名称,并具体描述每个开发包的用途。

参考答案:

Java SDK的版本分类如下所述。

• Java ME:(Java Platform Micro Edition)一种以广泛的消费性产品为目的的高度优化的Java运行环境,包括寻呼机、移动电话、可视电话、数字机顶盒等。它是致力于消费产品和嵌入式设备的开发人员的最佳选择。

• Java SE:(Java Platform Standard Edition)是针对桌面开发以及低端商务计算解决方案而开发的版本。

• Java EE:(Java Platform Enterprise Edition)是一种利用Java平台来简化企业解决方案的开发、部署和管理相关的复杂问题的体系结构。J2EE的基础是JAVA SE,J2EE不仅巩固了标准版中的许多优点,同时还提供了对EJB、Servlets、JSP以及XML技术的全面支持。面向对象设计思想是Java程序设计基础,作为一个合格的Java程序员,必须对面向对象编程(OOP)有深刻的理解。所以常见的面试题中都会出现考察求职者对OOP理解方面的题目。

面试题2 Java语言的特性有哪些

考点:考察求职者对Java语言的认识。

出现频率:★★

面试题解析】需要求职者列出Java语言的几个重要特点。答题时只需要写出特点,一般不需要详细解释。下面参考答案中给出了相应的详细描述,供读者参考,同时加强理解。

参考答案:

Java语言是一个面向对象的程序设计语言。Java语言吸收了Smalltalk语言和C++语言的优点,并增加了其他特性,如支持并发程序设计、网络通信和多媒体数据控制等。主要特性如下。

(1)Java语言是简单的。一方面,Java语言的语法与C语言和C++语言很接近,大多数程序员很容易学习和使用Java。另一方面,Java丢弃了C++中使用频率相对较少的、较难理解的一些特性,如操作符重载、多继承、自动的强制类型转换。特别地,Java语言不使用指针,并提供了自动的废料收集,使得程序员不必为内存管理而担忧。

(2)Java语言是面向对象的。Java语言提供类、接口和继承等特性,只支持类之间的单继承,但支持接口之间的多继承,并支持类与接口之间的实现机制(关键字为implements)。Java语言全面支持动态绑定,而C++语言只对虚函数使用动态绑定。总之,Java语言是一个单纯的面向对象的程序设计语言。

(3)Java语言是分布式的。Java语言支持Internet应用的开发,在基本的Java应用编程接口中有一个网络应用编程接口(java.net),它提供了用于网络应用编程的类库,包括URL、URLConnection、Socket、ServerSocket等。Java的RMI(远程方法激活)机制也是开发分布式应用的重要手段。

(4)Java语言是健壮的。强类型机制、异常处理机制、垃圾回收机制、安全检查机制等是Java程序健壮性的重要保证。对指针的丢弃是Java的明智选择。

(5)Java语言是安全的。Java通常被用在网络环境中,以防恶意代码的攻击。除了Java语言具有的许多安全特性以外,Java对通过网络下载的类本身具有一个安全防范机制,通过分配不同的名字空间,以防替代本地的同名类和字节代码检查,并提供安全管理机制(类SecurityManager)让Java应用设置安全哨兵。

(6)Java语言是跨平台的。Java程序在Java平台上被编译为体系结构中立的字节码格式(后缀为class的文件),可以在任何操作系统中的Java虚拟机上运行。

(7)Java语言是多线程的。Java语言支持多个线程的同时执行,并提供多线程之间的同步机制(关键字为synchronized)。

面试题3 Linux操作系统下如何安装Java SE开发环境

考点:由于大部分的计算机用户都使用Windows作为操作系统,而Java语言是具有跨平台优势的,不同企业有不同的开发环境,本试题考察求职者是否有在Linux下开发Java的经验。Linux环境下的Java安装是一个基础问题。

出现频率:★★★

面试题解析】该问题有两个关键点,一个是Linux版本Java SDK的文件类型,另外一个是Linux环境变量的配置。

参考答案:

Oracle发布的Linux操作系统Java包有JDK和JRE两种版本。JDK(Java Development Kit,Java开发包)是整个Java的核心,包括了Java运行环境(Java Runtime Envirnment),一堆Java工具和Java基础的类库(rt.jar)。

JRE(Java Runtime Envirnment,Java运行环境)是JDK的一个部分,仅仅提供了运行Java程序的环境,如果开发Java程序,必须安装JDK。

(1)首先到Sun的网站上去下载JDK,截止本书编写时最新版本为Java 7 update 21,下载jdk-7u21-linux-i586.tar.gz文件。

(2)把安装文件解压出来。假设下载的文件保存在/opt下。打开终端,运行以下命令:

        cd /opt
        tar zxvf jre-7u21-linux-i586.tar.gz

Java文件将安装在/opt目录中的jdk1.7.0_21内。

(3)测试是否安装成功,可以在控制台中输入如下命令:

        java -version

如果安装成功,控制台会显示当前JDK的版本信息。

(4)配置JAVA_HOME环境变量:一般Java开发者需要在操作系统的环境变量中配置JAVA_HOME,这样才能使其他Java项目,例如Struts、Tomcat等能够正常运行。这里以最常用的bash命令解释器为例,编辑用户目录下的.bashrc或.profile文件。如果需要在所有用户的shell下都生效,就编辑/etc/profile文件。同样都是加入以下内容:

        export JAVA_HOME=/opt/ jdk1.7.0_21
        export JRE_HOME=/opt/jdk1.7.0_21 /jre
        export CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH
        export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH:.

注意:在Windows操作系统中安装JDK更加简单,只需要配置好 JAVA__HOMECLASSPATH这2个环境变量即可。Linux配置中,多个路径直接使用“:”连接,而Windows操作系统中则使用“,”来连接。为了方便Java程序的编译,特别是使用javac来进行编译的情况下,需要在CLASSPATH中加入“.”,即当前路径。

面试题4 列出你熟悉的Java开发工具

考点:该问题一般会在面试时出现,主要是看求职者是否熟悉常用的Java开发工具,因为一个项目开发团队会使用一种固定的开发工具,只有求职者能够熟练使用该工具,才能够快速融入该团队。

出现频率:★★★★★

面试题解析】Java作为一种跨平台开发语言,由于其开源性,各个公司和社区组织,都推出了各自的Java开发工具,这也是Java开发体系同微软的开发体系的区别之一。不同的项目开发团队一般都有自己熟悉的开发工具或者开发环境,求职者只有熟练使用不同的开发工具,才能适应项目开发需要,得到用人单位的认同,增加成功的把握。从国内的情况来看,大多数都是使用JBuilder和Eclipse作为项目开发的首选工具,所以,求职者应该至少掌握其一。

参考答案:

常见的Java开发工具如下所述。

(1)JDK(Java Development Kit)Java开发工具:最基本的开发工具,必须掌握。

(2)Borland的JBuilder:JBuilder是历史比较悠久的Java集成开发环境,也是要求求职者需要掌握的。不过目前很多开发团队并不使用JBuilder作为开发工具,因为它是一个商业性的产品,需要付费。

(3)Oracle的JDeveloper:最新版本为11g,是Oracle公司提供的开发工具,它为构建具有J2EE功能的、多层的Java应用程序提供了一个完全集成的开发环境。目前国内使用率比较低,对于初学者来说,较复杂,也比较难。

(4)IBM的Visual Age for Java:Visual Age for Java是一个非常成熟的开发工具,它的特性对于IT开发者和业余的Java编程人员来说都是非常有用的。但是在国内,它也不是Java应用开发的主流工具。

(5)Eclipse:Eclipse是一种可扩展的开放源代码的集成开发环境。Eclipse发展最快,得到了国内外大多数程序员的肯定,目前已经成为主流的Java开发工具。Eclipse的最大特点是能接受由Java开发者自己编写的开放源代码插件,同时Eclipse为工具开发商提供了更好的灵活性,使他们能更好地控制自己的软件技术。

Eclipse可以说是求职者必须掌握的一个Java开发工具,缺点就是较复杂,对初学者来说,使用起来比较困难。

注意:此面试题的目的是了解求职者对于Java开发工具的认识和掌握。回答此类问题时,不必列出所有的开发工具。实际上,Java开发工具是非常多的,除了这里列出的之外,还有Microsoft VJ++、JCreator、Intellij IDEA和BEA的WebLogic Workshop等。求职者一般只要熟练使用JBuilder和Eclipse就可以满足大部分的国内开发要求。值得注意的是,有些特别的公司,例如IBM会要求求职者熟悉IBM的Visual Age for Java,这就要求求职者在面试之前一定要先了解该公司的大致情况,做好相关的准备。

面试题5 用自己的语言描述Java中的类和对象

下列关于对象的哪一种说法是正确的?请选择一个正确的答案。

(a)对象是可以对其进行实例化从而得到类的东西。

(b)对象是类的实例。

(c)对象是一种蓝本,据此可以创建抽象的具体实现。

(d)对象是指向属性的引用。

(e)对象是一种变量。

考点:该面试题考察求职者对于Java类和对象的理解。

出现频率:★★★

【面试题解析】

1.类

在处理复杂事物的时候,用到的一种基本手段就是抽象。抽象的目的就是区别事物之间的本质和不同,面向对象编程(OOP)的实质就是利用类和对象来建立抽象模型。

类表示了对象的类别,是创建对象的蓝本。建立一个事物的抽象模型,本质上就是表达该事物的性质和行为。使用类来建立抽象模型,是通过在类中定义变量和方法来实现的。

类中定义的属性是一种可存储值的变量,该变量代表着事物的具体性质。类的对象所具有的行是由定义的方法来实现的。类中定义的变量和方法被称为类的成员。

在项目开发中,类一般可以通过UML建模来表示,如图1.1所示。

图1.1 类的UML表示法

图1.1中,定义了类Gun的成员,即类Gun的变量和方法。从UML图中可以看到,类定义了如下所示3个变量。

caliber:是一个Double类型的变量,表示Gun类所抽象事物(枪)的口径。

length:是一个Double类型的变量,表示Gun类所抽象事物(枪)的长度。

gun_type:是一个字符串类型的变量,表示Gun类所抽象事物(枪)的类型,例如是手枪还是突击步枪。

同时类中定义了如下所示3个方法。

• fire:定义了Gun的开火行为,及fire方法。

• maintenance:定义了Gun的维护方法。

• Gun:定义了一个同类同名的构造方法。

开发者可以通过UML生成代码工具,或者是手工在编辑器中建立图1.1中所示的类,如下所示:

        public class Gun {

              // 定义枪的口径
              public Double caliber;
              // 定义枪的长度
              public Double length;
              // 定义枪的类型
              public int gun_type;

              // 构造方法
              public Gun() {
              }
              // 带参数的构造方法
              public Gun(String name) {
              }
              // 开火的方法
              public void fire() {
                  System.out.println(gun_type +" is fireing");
              }
              // 维护的方法
              public Boolean maintenance() {
                  return true;
              }
        }

2.对象

对象是类的实例。对象在构造时以类为蓝本,创建对象的过程叫做实例化。对象是类所表示的抽象事物的具体实例。例如前面所讲述的Gun类,那么可以根据Gun类创建一个ak47的对象,即Gun的具体实现。

对象可以使用UML来表示,如图1.2所示。

图1.2 对象的UML表示法

ak47是根据Gun类创建的一个对象,在Java程序中,可以使用如下代码创建一个Gun对象:

        ……
        public static void main(String[] args) {
                    //建立一个Gun类对象,即Gun类的实例ak47
                    Gun ak47=new Gun();
                    //定义ak47的口径
                    ak47.caliber=7.6;
                    //定义ak47的长度
                    ak47.length=57.8;
                    //定义ak47的类型
                    ak47.gun_type="AK47";
                    //调用fire方法
                    ak47.fire();
              }
        ……

运行该示例,结果如下:

        AK47 is firing

参考答案:(b)。

面试题6 命名Java变量

请命名以下变量。

表1.1 面试题6

考点:该面试题主要考察求职者的编程习惯,良好的编程习惯是一个优秀的Java开发者的必备素质。求职者应该掌握基本的Java命名规范,这样编写出来的代码才能做到够规范和易读。

出现频率:★★★

面试题解析】在面向对象编程中,对于类、对象变量、方法等的命名是非常有技巧的,例如,大小写的区分,使用不同字母开头等。但究其本,追其源,在为一个资源命名时,应该本着描述性和唯一性两大特征,才能保证资源之间不冲突,并且便于记忆。

1.包的命名

Java包的名字都是由小写单词组成。每一名Java程序员都可以编写属于自己的Java包,为了保障每个Java包命名的唯一性,最新的Java编程规范,要求程序员在自己定义的包的名称之前加上唯一的前缀。由于互联网上的域名是不会重复的,所以程序员一般采用自己在互联网上的域名作为自己程序包的唯一前缀。

例如:net.frontfree.javagroup。

2.类的命名

类的名字必须由大写字母开头,单词中的其他字母均为小写。如果类名称由多个单词组成,则建议将每个单词的首字母均用大写,例如TestPage。如果类名称中包含单词缩写,则建议将这个词的每个字母均用大写,如XMLExample。由于类是设计用来代表对象的,所以建议在命名类时应尽量选择名词。

3.方法的命名

方法的名字的第1个单词应以小写字母作为开头,后面的单词则建议用大写字母开头。

例如:sendMessge。

4.常量的命名

常量的名字应该都使用大写字母,并且指出该常量的完整含义。如果一个常量名称由多个单词组成,则建议用下划线来分割这些单词。

例如:MAX_VALUE。

5.参数的命名

参数的命名规范和方法的命名规范相同,而且为了避免阅读程序时造成迷惑,请尽量保证在参数名称为一个单词的情况下,参数的命名尽可能明确。

6.Javadoc注释

Java除了可以采用常见的注释方式之外,Java语言规范还定义了一种特殊的注释,也就是通常所说的Javadoc注释,它是用来记录代码中的API的。Javadoc注释是一种多行注释,以/**开头,而以*/结束,注释可以包含一些HTML标记符和专门的关键词。使用Javadoc注释的好处是编写的注释可以被自动转化为在线文档,省去了单独编写程序文档的麻烦。例如:

        /**
        *This is an example of
        * Javadoc
        *
        *@author darchon
        *@version 0.1, 10/11/2002
        */

在每个程序的最开始部分,一般都用Javadoc注释进行程序的总体描述以及版权信息。在主程序中可以为每个类、接口、方法、变量添加Javadoc注释,每个注释的开头部分先用一句话概括该类、接口、方法、变量所完成的功能,这句话应单独占据一行以突出其概括作用,在这句话后面可以跟随更加详细的描述段落。

在描述性段落之后还可以跟随一些以Javadoc注释标签开头的特殊段落,例如上面例子中的@auther和@version,这些段落将在生成的文档中以特定方式显示。

虽然添加注释不会使一个设计低劣的程序变成好的程序,但是如果按照编程规范编写程序,并且为程序添加良好的注释,却可以帮助编写出设计优美、运行高效,且易于理解的程序。尤其在多人合作完成同一项目时,编程规范非常重要。俗话说“磨刀不误砍柴工”,花费一点时间去适应一下Java编程规范是有好处的。

参考答案:(符合命名规则即可。)

表1.2 面试题6答案

面试题7 理解成员

下面关于实例成员的哪一种说法是正确的?

(a)实例成员也被称为静态成员。

(b)实例成员总是变量。

(c)实例成员从不是方法。

(d)实例成员隶属于实例,但不隶属于整个类。

(e)实例成员总是代表着运算。

考点:考察求职者对于实例成员的理解。

出现频率:★★★★

【面试题解析】

1.实例成员

对象是以类为蓝本创建的类的实例。在类中,一般都定义了类的成员(变量和方法),在创建类的对象时,对象都会拥有类中所定义变量的副本,对象的变量也被称为实例变量。对象的实例变量的值代表了该对象的状态,例如ak47对象,其中gun_type的对象变量表明了该对象为“ak47”类型的Gun。如果一个类的两个对象处于同一个状态,则它们的某个实例变量应该是相同的。

对象的方法定义了该对象的行为,一般被称为实例方法。实例方法属于该类的每个对象,而方法的实现是有所有的类实例共享的。求职者应该加以区别。

隶属于对象的实例变量和实例方法合称为对象的实例成员。值得注意的是,应与类的静态成员相区别,静态成员只是隶属于类,而不隶属于对象。

2.静态成员

静态成员隶属于类,而不属于任何该类生成的对象,当类加载时就会初始化静态变量;同样,静态方法也是隶属于类的,而不是对象。静态变量和静态方法合称为静态成员。例如,类Gun中可以增加gunAmount静态变量和getGunAmount()静态方法,如图1.3所示。

图1.3 增加静态成员的UML表示图

根据图1.3所示的UML模型,修改后的Gun类代码如下所示:

        public class Gun {
            // 定义枪的口径
              public Double caliber;
              // 定义枪的长度
              public Double length;
              // 定义枪的类型
              public String gun_type;
              //定义静态变量
              public static int gunAmount;
              // 构造方法
              public Gun() {
                  gunAmount++;
              }
              // 带参数的构造方法
              public Gun(String name) {
                  gunAmount++;
              }
              // 开火的方法
              public void fire() {
                  System.out.println(gun_type +" is firing");
              }
              // 维护的方法
              public Boolean maintenance() {
                  return true;
              }
              //获得静态变量值
              public static int getGunAmount(){
                  return gunAmount;
              }
        }

测试方法代码如下所示:

        ……
        public static void main(String[] args) {
                  //建立Gun类对象,即Gun类的实例ak47
                  Gun ak47=new Gun();
                  //使用带参数的构造方法
                  Gun m16=new Gun("M16 Gun");
                  //打印类的静态变量值
                  System.out.println("Zhe Gun Amount is:"+Gun.gunAmount);
                  //定义ak47的口径
                  ak47.caliber=7.6;
                  //定义ak47的长度
                  ak47.length=57.8;
                  //定义ak47的类型
                  ak47.gun_type="AK47";
                  //调用fire方法
                  ak47.fire();
              }
        ……

运行该测试方法,结果如下:

        Zhe Gun Amount is:2
        AK47 is firing

可见,静态成员只隶属于类,而不是对象。表1.3给出了类成员的相关解释。

表1.3 类成员的相关术语

参考答案:(d)。

面试题8 在Java中,对象是如何传递消息的

请选择一个正确答案。

(a)对象通过彼此的变量来传递消息。

(b)对象通过修改彼此类的静态变量来传递消息。

(c)对象通过调用彼此的实例方法来传递消息。

(d)对象通过调用彼此类的静态方法来传递消息。

考点:考察求职者对于对象传递消息的理解。

出现频率:★★

面试题解析Java对象之间的消息传递,是通过调用相互的实例方法来实现的,而不是静态方法。

参考答案:(c)。

面试题9 对于类的静态变量的理解

运行下面程序,请选择输出结果。

        public class x {
              private static int a;
              public static void main(String[] args) {
                  modify(a);
                  System.out.println(a);
              }
              public static void modify(int a) {
                  a++;
              }
        }

(a)0

(b)1

(c)2

(d)3

考点:考察求职者对于类的静态变量的理解。

出现频率:★★★★

【面试题解析】类的静态变量a在modify()方法中并没有被改变,而是改变了modify()方法的参数。如果将上述代码修改如下:

        public class x {
              private static int a;
              public static void main(String[] args) {
                  modify(a);
                  System.out.println(a);
              }
              public static void modify(int a) {
                  a++;
              }
        }

那么输出结果为1,但是面试题中静态变量a的值并没有改变,所以应该输出为0。

参考答案:(a)。

面试题10 类继承的建模表示方法

根据图1.4的UML表示,选择一个正确的描述。

图1.4 UML表示图

(a)Box类是MyBox类的子类。

(b)Box类是MyBox类的父类。

(c)Box类和MyBox类是聚合关系。

(d)Box类和MyBox类是一对多关系。

考点:该面试题貌似简单,在实际的面试中回答正确的却并不是很多,其实只是考察求职者对类的继承的建模表示方法的掌握程度。

出现频率:★★★

面试题解析】Java中有两种机制来保证根据现有的类来构造新的类,那就是继承和聚合。例如,有一个盒子的类Box,开发者就可以根据类Box来构造各种细化的盒子类,因为所有的细化盒子类都是类Box的一种,这是一种继承的关系。

在UML建模表示图中,继承使用一个空心的三角箭头来表示,该箭头的方向是由子类指向父类的,表明子类依赖于父类,如图1.5所示。

图1.5 类的继承UML表示图

在Java中,要从现有的类构造出新的类,需要在子类的定义中使用extends子句。值得注意的是,在Java中,子类只能扩展一种父类,子类将继承超类的成员。示例代码如下:

        //定义父类Box
        class Box {
              //默认属性可以被继承
              int high;
              //private不能被继承
              private static String location;
              private int counter;
              //protected可以被继承
              protected boolean isFull;
              //构造函数
              Box() {
                  high = 20;
                  location = "Room";
                  counter = 1;
                  isFull = true;
              }

              public static void printLocation() {
                  System.out.println("Location:" + location);
              }

              private void printCounter() {
                  System.out.println("Number of boxs::" + counter);
              }

              public boolean isFull() {
                  return isFull;
              }

              public int getCounter() {
                  return counter;
              }

              public void doLoad() {
                  isFull = true;
              }

              public void doRemove() {
                  isFull = false;
              }
        }

        //子类
        class MyBox extends Box {
              private int length = 99;
              private int colorNo = 45;
              //覆盖父类属性
              private int high=120;
              public int getLength() {
                  return length;
              }
              public void printInfo() {
                  System.out.println("Length:" + getLength());
                  System.out.println("ColorNo:" + colorNo);
                  System.out.println("High:" + high);
                  System.out.println("isFull:" + isFull);
                  System.out.println("Counter:" + getCounter());
                  printLocation();
              }
        }

编写一个子类的测试类,其测试方法如下:

        public static void main(String[] args) {
                    MyBox mybox = new MyBox();
                    mybox.printInfo();
              }

运行结果如下:

        Length:99
        ColorNo:45
        High:120
        isFull:true
        Counter:1
        Location:Room

可见,子类继承了父类的成员。

参考答案:(b)。

面试题11 使用jar命令

请使用jar命令,将test文件夹压缩成.jar文件,并简述其压缩包的结构。

考点:对于Java程序员来说,更多情况下是使用的集成Java开发工具,例如JBuilder、Eclipse等,而对于最基本的Java编译和常见的命令行工具往往都不熟悉。这个面试题主要考察求职者对于Java命令行基本工具的使用,从而了解求职者对Java编程的熟悉程度。

出现频率:★★★

面试题解析】熟练的Java开发者应该掌握常用的Java命令行工具。求职者应该熟练掌握javac、java和jar等工具。

1.javac

javac是JDK的标准编译工具,常见的形式为:javac <选项> <源文件>。它可能的选项包括下面各项。

• -g:生成所有调试信息。

• -g:none:生成无调试信息。

• -g:{lines,vars,source}:生成只有部分调试信息。

• -nowarn:生成无警告。

• -verbose:输出关于编译器正在做的信息。

• -deprecation:输出使用了不鼓励使用的API的源程序位置。

• -classpath <路径>:指定用户类文件的位置。

• -sourcepath <路径>:指定输入源文件的位置。

• -bootclasspath <路径>:覆盖自举类文件的位置。

• -extdirs <目录(多个)>:覆盖安装的扩展类的位置。

• -d <目录>:指定输出类文件的位置。

• -encoding <编码>:指定源文件中所用的字符集编码。

• -target <版本>:生成指定虚拟机版本的类文件。

常见的问题:在使用javac编译.java源文件时找不到jar包,则需使用-classpath选项。例如:

        javac -classpath .;jar01.jar;jar01.jar;……;jarN.jar   class_name.java

使用-classpath选项,指定了在编译Java源代码时,用到类库的位置。一般用于该类库不在当前CLASSPATH的环境变量中。

2.java

java命令是JDK默认的java执行程序,在这里值得注意的是,在执行带包的.class文件时,需要使用标准的Java包形式。例如:

        java com.nsfc.hello

3.jar

随着JDK安装,在JDK安装目录下的bin目录中存在一个可执行文件,Windows下文件名为jar.exe,Linux下文件名为jar。它的运行需要用到JDK安装目录下lib目录中的tools.jar文件。jar命令行格式为:

        jar {ctxu}[vfm0M] [jar-文件] [manifest-文件] [-C目录] 文件名

其中{ctxu}是jar命令的子命令,每次jar命令只能包含一个子命令,这些子命令的含义如下所述。

• -c创建新的JAR文件包。

• -t列出JAR文件包的内容列表。

• -x展开JAR文件包的指定文件或者所有文件。

• -u更新已存在的JAR文件包(添加文件到JAR文件包中)。

[vfm0M]中的选项可以任选,也可以不选,它们是jar命令的选项参数。

• -v生成具体报告,并打印到标准输出。

• -f指定JAR文件名,通常这个参数是必须的。

• -m指定需要包含的MANIFEST清单文件。

• -0只存储,不压缩,这样产生的JAR文件包会比不用该参数产生的体积大,但速度更快。

• -M不产生所有项的清单(MANIFEST〕文件,此参数会忽略-m参数。

[jar-文件]:即需要生成、查看、更新或者解开的JAR文件包,它是-f参数的附属参数。

[manifest-文件]:即MANIFEST清单文件,它是-m参数的附属参数。

[-C目录]:表示转到指定目录下去执行这个jar命令的操作。它相当于先使用cd命令转到该目录下,再执行不带-c参数的jar命令,它只能在创建和更新JAR文件包的时候使用。

文件名:指定一个文件/目录列表,这些文件/目录就是要添加到JAR文件包中的文件/目录。假如指定了目录,那么jar命令打包的时候会自动把该目录中的所有文件和子目录打入包中。

使用JDK的jar命令打包,会自动在压缩包中生成一个META-INF目录,其中有一个MANIFEST.MF文件。

使用jar命令进行如下压缩:

        jar cf test.jar test

即将当前目录下的test目录所有文件压缩到test.jar文件中,使用WinRaR软件可以看到该压缩文件的目录,结果如图1.6所示。

图1.6 jar压缩文档的结构

参考答案:

可以使用“jar cf test.jar test”命令来完成压缩。在压缩包中,包含一个test文件夹和一个META-INF文件夹,其中有一个MANIFEST.MF文件。

面试题12 如何执行mian()方法

利用Java SDK中哪一条命令能够执行test的main()方法?

(a)java test

(b)javac test

(c)java test.java

(d)java test.class

(e)java test.main

考点:考察求职者对java命令的熟悉程度。

出现频率:★★★

面试题解析】求职者容易出现的错误是选择了(d)。实际上,java命令后面只需要class文件的名称就可以,不用加入.class全名。如果使用java test.class命令,系统会认为这是一个包的结构,会查找test.class.class文件。会出现如下异常信息:

        Exception in thread “main” java.lang.NoClassDefaultError:test/class

提示找不到相应的类文件。

参考答案:(a)。

面试题13 Java开发原则

请选择下面Java语言描述正确的项。

(a)Java的开发都是封装到类中的。

(b)Java中只有一种值:元数据类型值。

(c)引用代表那些根据类创建的对象。

(d)对象可以通过多种方式加以操作。

考点:考察求职者对Java开发原则的理解。

出现频率:★★★

面试题解析Java开发一般遵循以下几个原则:

• Java中的代码必须封装到类中。

• Java中有两种值:对象的引用和元数据类型值。

• 引用代表根据类创建的对象。

• 对象只能通过引用加以操作。

• Java中的对象不能包含其他对象,对象只能拥有指向其他对象的引用。

参考答案:(a)、(c)。