java
求职者需要熟练掌握以下知识点。
q ? Java的安装与调试,重点是Java环境的配置。
q ? Java开发中基本术语和基本概念。
q ? 理解类、对象、引用、变量、方法和成员。
q ? 熟练掌握Java的调试和运行。
q ? 了解和掌握常用的Java开发工具。
2.1 Java概述和开发环境
理解Java和掌握Java开发包的安装,是每个Java开发者最基本的技能,任何层次的公司都可能考查这个方面,求职者不应该忽视。
2.1.1 理解Java
对于Java概述,求职者往往觉得是Java开发的入门知识,面试中不会出现,实际上,非常多的公司面试中会出现比较基础的Java面试例
,来考查求职者对于Java基础方面的理解和掌握。
面试例题1:Java开发包的种类。
考点:考查求职者对于Java体系的认识,属于Java程序员的必备知识。 出现频率:???
解析
随着Java语言的成长和壮大,Java的开发包根据用途的不同已经分为Java EE、Java SE和Java ME3个,求职者列出名称并具体描述每个开发包的用途即可。
答案
Java SDK的版本分类如下。
Java ME (Java Platform Micro Edition):一种以广泛的消费性产品为目的的高度优化的Java运行环境,包括寻呼机、移动电话、可视电话、数字机顶盒等。它是致力于消费产品和嵌入式设备的开发人员的最佳选择。
SUN公司针对桌面开发以及低端商务计算解Java SE (Java Platform Standard Edition):
决
而开发的版本。
Java EE (Java Platform Enterprise Edition):一种利用Java平台来简化企业解决方案的开发、部署和管理相关的复杂问题的体系结构。Java EE的基础是Java SE,Java EE不仅巩固了
版中的许多优点,同时还提供了对EJB、Servlet、JSP以及XML技术的全面支持。 面试例题2:Java语言的特性有哪些,
考点:考查求职者对Java语言的认识。面向对象
思想是Java程序设计基础,作为一个合格的Java程序员,必须对面向对象编程(OOP)有深刻的理解。所以常见的面试例题中都会出现考查求职者对OOP理解方面的题目。
出现频率:??
解析
需要求职者列出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)。
2.1.2 如何构建Java开发环境
面试例题3:Linux操作系统下如何安装Java SE开发环境。
考点:由于大部分的计算机用户都使用Windows作为操作系统,而Java语言是具有跨平台优势的,不同企业有不同的开发环境,本试题考查求职者是否有在Linux下开发Java的经验。Linux环境下的Java安装是一个基础问题。
出现频率:???
解析
该问题有两个关键点:一个是Linux版本Java SDK的文件类型,另外一个是Linux环境变量的配置。
答案
Sun发布的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 6 update 10),下载jdk-6u10-beta-linux-i586.bin文件。
(2)把安装文件解压出来。假设下载的文件保存在/opt下。打开终端,运行以下命令:
cd /opt
chmod a+x jdk-6u10-beta-linux-i586.bin
./jdk1.x.bin
接着将看到版权提示信息,按空格键翻页,然后会有提示是否同意版权协议[yes/no],此时输入yes,按回车键,安装程序就会把文件解压到当前目录下的jdk1.6目录下。
(3)测试是否安装成功,可以在控制台中输入如下命令:
java –version
如果安装成功,控制台会显示当前JDK的版本信息。
(4)配置JAVA_HOME环境变量。一般Java开发者需要在操作系统的环境变量中配置JAVA_HOME,这样其他Java项目,例如Struts,Tomcat等才能够正常运行。这里以最常用的bash命令解释器为例,编辑用户目录下的.bashrc或.profile文件。如果需要在所有用户的shell下都生效,应该编辑/etc/profile文件,同样都是加入以下内容:
export JAVA_HOME=/opt/jdk1.6
export JRE_HOME=/opt/jdk1.6/jre
export CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH
export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH:.
注意:在Windows操作系统中安装JDK更加简单,只需要配置好JAVA__HOME和CLASSPATH这两个环境变量即可。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来作为开发工具,因为它是一个商业性的产品,需要付费。
le的JDeveloper:Oracle 9i JDeveloper(最新为10g)是Oracle公司提供的(3)Orac
开发工具,为构建具有Java EE功能,基于XML和WebServices的、复杂的、多层的Java应用程序提供了一个完全集成的开发环境。目前国内使用率比较低,对于初学者来说,较复杂,也比较难。
(4)IBM的Visual Age for Java:Visual Age for Java是一个非常成熟的开发工具,它的特性对于IT开发者和业余的Java编程人员来说是非常有用的。但是在国内,也不是Java应用开发的主流工具。
:Eclipse是一种可扩展的、开放源代码的集成开发环境。Eclipse发展最快,(5)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,这就要求求职者在面试之前一定要先了解该公司的大致情况,做好相关的准备。
2.2 Java语言基础
通常,面试过程中会涉及Java基础方面的问题,例如类、对象、变量、方法等。这要求求职者对基于面向对象编程(OOP)有一个深入的了解。
2.2.1 什么是Java的类和对象
面试例题5:Java的类和对象。
下列关于对象的哪一种说法是正确的,请选择正确的答案。
(a)对象是可以对其进行实例化从而得到类的东西。
(b)对象是类的实例。
(c)对象是一种蓝本,据此可以创建抽象的具体实现。
(d)对象是指向属性的引用。
(e)对象是一种变量。
考点:该面试例题考查求职者对于Java类和对象的理解。
出现频率:???
解析
1(类
在处理复杂事物的时候,用到的一种基本手段就是抽象。抽象的目的就是区别事物之间的本质和不同,
面向对象编程(OOP)的实质就是利用类和对象来建立抽象模型。
类表示了对象的类别,是创建对象的蓝本。建立一个事物的抽象模型,本质上就是表达该事物的性质和行为。使用类来建
立抽象模型,是通过在类中定义变量和方法来实现的。
类中定义的属性是一种可存储值的变量,该变量代表着事物的具体性质。类的对象所具有的行是由定义的方法来实现的。类中
定义的变量和方法被称为类的成员。
在项目开发中,类一般可以通过UML建模来表示,如图2.1所示。
图2.1中,定义了类Gun的成员,即类Gun的变量和方法。从UML图中可以看到,类定义了如下所示
的3个变量。
q ? caliber:是一个Double类型的变量,该变量表示了Gun类所抽象事物(枪)的口径。
qq length:是一个Double类型的变量,该变量表示了Gun类所抽象事物(枪)的长度。
q ? gun_type:是一个字符串类型的变量,该变量表示了Gun类所抽象事物(枪)的类型,例如是手枪还是突击步枪。
同时类中定义了如下所示的3个方法。
q ? fire():定义了Gun的开火行为,即fire()方法。
q ? maintenance():定义了Gun的维护方法。
q ? Gun():定义了一个同类同名的构造方法。
开发者可以通过UML生成代码工具或者是手工在编辑器中建立图2.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来表示,如图2.2所示。
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)。
2.2.2 必须掌握Java命名规范
面试例题6:命名Java变量。
请命名以下变量。
表2.1 变量命名
数 据 类 型 中 文 含 义 作 用 域
Int 序列号 全局范围
(类) 用户账单 (类)
String 用户名称 类成员
Float 当月收入 类成员
Static final 最大金额 类成员
Double 罚款 局部变量
(包) 用户 (包)
考点:该面试例题主要考查求职者的编程习惯,良好的编程习惯是一个优秀的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编程规范是有好处的。 答案:如表2.2所示(符合命名规则即可)。
表2.2 变量命名
数 据 类 型 中 文 含 义 作 用 域 你 的 命 名
Int 序列号 全局范围 globalID
(类) 用户账单 (类) UserReckoning
String 用户名称 类成员 userName
Float 当月收入 类成员 currentMonHarvest
Static final 最大金额 类成员 MAX_MONEY
Double 罚款 局部变量 smartMoney
(包) 用户 (包) user
2.2.3 区分实例成员和静态成员
面试例题7:理解成员。
下面关于实例成员的哪一种说法是正确的,
(a)实例成员也被称为静态成员。
(b)实例成员总是变量。
(c)实例成员从不是方法。
(d)实例成员隶属于实例,但不隶属于整个类。
(e)实例成员总是代表着运算。
考点:考查求职者对于实例成员的理解。
出现频率:????
解析
1(实例成员
对象是以类为蓝本创建的类的实例。在类中,一般都定义了类的成员(变量和方法),在创建类的对象时,对象都会拥有类中所定义变量的副本,对象的变量也被称为实例变量。对象的实例变量的值代表了该对象的状态,例如ak47对象,其中gun_type的对象变量表明了该对象为“ak47”类型的Gun。如果一个类的两个对象处于同一个状态,则它们的某个实例变量应该是相同的。
对象的方法定义了该对象的行为,一般被称为实例方法。实例方法属于该类的每个对象,而方法的实现是由所有的类实例共享的。求职者应该加以区别。
隶属于对象的实例变量和实例方法合称为对象的实例成员。值得注意的是,应与类的静态成员相区别,静态成员只是隶属于类,而不隶属于对象。
2(静态成员
静态成员隶属于类,而不属于任何该类生成的对象,当类加载时就会初始化静态变量。同样,静态方法也是隶属于类的,而不是对象。静态变量和静态方法合称为静态成员。例如,类Gun中可以增加gunAmount静态变量和getGunAmount()静态方法,如图2.3所示。
根据图2.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
可见,静态成员只隶属于类,而不是对象。表2.3给出了类成员的相关解释。
表2.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)。
2.2.4 理解继承
面试例题10:类继承的建模表示方法。
根据图2.4的UML表示,选择正确的答案。
(a)Box类是MyBox类的子类。
(b)Box类是MyBox类的父类。
(c)Box类和MyBox类是聚合关系。
(d)Box类和MyBox类是一对多关系。
考点:该面试例题貌似简单,在实际的面试中能回答正确的求职者却并不是很多,其实只是考查求职者
对类的继承的建模表示方法的掌握程度。
出现频率:???
解析
Java中有两种机制来保证根据现有的类来构造新的类,那就是继承和聚合。例如,有一个盒子的类Box,
开发者就可以根据类Box来构造各种细化的盒子类,因为所有的细化盒子类都是类Box的一种,这是一种继
承的关系。
在UML建模表示图中,继承使用一个空心的三角箭头来表示,该箭头的方向是由子类指向父类的,表明
子类依赖于父类,如图2.5所示。
在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)。
2.2.5 熟悉Java的常用命令
面试例题11:使用jar命令。
请使用jar命令,将 test文件夹压缩成.jar文件,并简述其压缩包的结构。
考点:对于Java程序员来说,更多情况下是使用集成Java开发工具,例如JBuilder、Eclipse等,而对于最基本的Java编译和常见的命令行工具往往都不熟悉,这个面试例题主要考查求职者对于Java命令行基本工具的使用,从而了解求职者对Java编程的熟悉程度。
出现频率:???
解析
熟练的Java开发者应该掌握常用的Java命令行工具。求职者应该熟练掌握javac、java和jar等工具。
1(javac
javac是JDK的标准编译工具,常见的形式为:javac <选项> <源文件>。它可能的选项包括: q ? -g:生成所有调试信息。
q ? -g:none:生成无调试信息。
q ? -g:{lines,vars,source}:生成只有部分调试信息。
q ? -nowarn:生成无警告。
q ? -verbose:输出关于编译器正在做的信息。
q ? -deprecation:输出使用了不鼓励使用的API的源程序位置。
q ? -classpath <路径>:指定用户类文件的位置。
q ? -sourcepath <路径>:指定输入源文件的位置。
q ? -bootclasspath <路径>:覆盖自举类文件的位置。
q ? -extdirs <目录(多个)>:覆盖安装的扩展类的位置。
q ? -d <目录>:指定输出类文件的位置。
q ? -encoding <编码>:指定源文件中所用的字符集编码。
q ? -target <版本>:生成指定虚拟机版本的类文件。
常见的问题:在使用javac编译.java源文件时找不到jar包,则需使用-classpath选项。例如:
javac -classpath .;jar01.jar;jar02.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命令只能包含一个子命令,这些子命令含义如下。 q ? -c:创建新的JAR文件包。
q ? -t:列出JAR文件包的内容列表。
q ? -x:展开JAR文件包的指定文件或者所有文件。
q ? -u:更新已存在的JAR文件包(添加文件到JAR文件包中)。
[vfm0M]中的选项可以任选,也可以不选,它们是jar命令的选项参数。
q ? -v:生成具体报告并打印到标准输出。
q ? -f:指定JAR文件名,通常这个参数是必须的。
q ? -m:指定需要包含的MANIFEST清单文件。
q ? -0:只存储,不压缩,这样产生的JAR文件包会比不用该参数产生的体积大,但速度更快。
q ? -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软件可以看到该压缩文件的目录结果如图2.6所示。
答案
可以使用“jar cf test.jar test”命令来完成压缩。压缩包中,包含一个test文件夹和一个META-INF文件夹,其中有一个MANIFEST.MF文件。
面试例题12:如何执行main()方法。
利用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)。
2.2.6 掌握Java编程原则
面试例题13:Java开发原则。
请选择下面Java语言描述正确的项。
(a)Java的开发都是封装到类中的。
(b)Java中只有一种值:元数据类型值。
(c)引用代表那些根据类创建的对象。
(d)对象可以通过多种方式加以操作。
考点:考查求职者对Java开发原则的理解。
出现频率:???
解析
Java开发一般遵循以下几个原则。
q ? Java中的代码必须封装到类中。
q ? Java中有两种值:对象的引用和元数据类型值。
q ? 引用代表根据类创建的对象。
q ? 对象只能通过引用加以操作。
q ? Java中的对象不能包含其他对象,对象只能拥有指向其他对象的引用。
答案:(a)(c)。