在Console显示字符串信息,熟悉命令行(cmd)下Java程序的编译与执行
声明:本系列博文为"爱校码.中国"原创博文,版权所有,未经授权,不得转载或抄袭,若发现将依法追责。
使用记事本编写一个简单的Java程序,这是学习者的入门要求,这个程序的功能就是输出一个字符串,学习者可以将自己的姓名作为字符串输出。写好程序后,在命令行利用JDK的javac命令编译后,利用java命令装载执行。
1. Java常用保留关键字
Java程序是由Java语句和声明组成纯文本文件,通过文本编辑器能够创建、编辑和保存Java程序,保存的程序文本是一个扩展名为.java
的文件,将此文本文件传递给Java编译器,产生扩展名为.class
的字节代码文件。编写Java代码时,需要了解Java语言的保留关键字(reserved word),它们作为Java语言的一部分,具有专门的意义和用途,不能当作一般的标识符使用。以下是常用的保留字:
abstract: 指定一个类或者其方法在它的子类中实现;
boolean: 一种数据类型,具有True或者False值;
break: 一种控制语句,用于跳出循环;
byte: 一种数据类型,具有8位数据值;
byvalue: 保留将来使用;
case: 在switch语句中标出文本块;
cast: 保留将来使用;
catch: 捕获异常;
char: 一种数据类型,包含无符号16位Unicode字符;
class: 声明类;
const: 保留将来使用;
continue: 将控制权交还到循环之外;
default: 在switch语句中指定默认代码块;
do: 开始do-while循环;
double: 一种数据类型,包含64位浮点数;
else: 在if语句中的可选分支;
extends: 指出一个类是从另一个类继承;
final: 指定变量为常量或者修饰不能被重写的方法;
finally: 在try-catch结构中指定必须要执行的代码;
float: 一种数据类型,包含32位浮点数;
for: 开始for循环;
future: 保留将来使用;
generic: 保留将来使用;
goto: 保留将来使用;
if: 检查true/false表达式,转到相应分支;
implements: 指定实现接口的类;
import: 引用相关类;
inner: 保留将来使用;
instanceof: 说明一个对象是指定类的实例,还是指定接口的实现;
int: 一种数据类型;
interface: 声明一个接口;
long: 一种数据类型,包含64位整数;
native: 指定方法使用本地平台代码实现;
new: 创建实例对象;
null: 指定一个空值引用;
operator: 保留将来使用;
outer: 保留将来使用;
package: 声明Java包;
private: 访问说明符,说明一个方法或变量只能在声明它的类内部访问;
protected: 访问说明符,说明一个方法或变量只能在声明它的类内部或者其子类或者同一个包中的其他类访问;
public: 访问说明符,用于类、接口、方法和变量,说明可以从整个应用程序内访问;
rest: 保留将来使用;
return: 从被调用的方法传递控制权,可能还有返回值;
short: 一种数据类型,包含16位整数;
static: 指出一个变量或者方法是类方法;
super: 用于方法或者类结构中说明类的基类;
switch: 基于测试值执行代码的语句;
synchronized: 在多线程代码中指定临界区或方法;
this: 在方法或者构造器中指向当前对象;
throw: 创建异常;
throws: 指出对象可能抛出异常;
transient: 指定变量不是对象持久状态的一部份;
try: 异常代码块的开始;
var: 保留将来使用;
void: 指定方法没有返回值;
volatile: 指出变量可能异步变化;
while: 开始while循环;
2. Java中注释表示
⑴ 在对Java程序进行注释时有一些基本约定:
⑵ Java中的注释有着特别的风格,从两个方面来说明:
① Java 注释语句类型
Java 有三种注释语句风格:以 /**
开始,*/
结束的文档注释,以 /*
开始,以*/
结束的C语言风格的多行注释,以及以//
开始,代码行末尾结束的单行注释。以下是对各类注释语句用法的一个说明:
注释语句类型 用法 示例
单行注释 在成员函数内部采用单行注 int num // 声明整型变量
释语句对业务逻辑、代码片段
和临时变量声明进行说明。
多行注释 多行注释是采用 C 语言风格 /*
的注释语句,它将无用的代码 * 这部分代码已被其它部分的代码
注释掉。保留这些代码是因为 * 替代,所以于 2023 年3 月5 日
用户可能改变想法,或者只是 * 被zcj注释掉。如果一年之后仍未
想在调试中暂时不执行这些 * 使用这些代码,可将其删除。
代码。 * . . . (源代码)
*/
文档注释 在接口、类、成员函数和成 /**
员变量声明之前紧靠它们的 * 这个类用于通过图形界面显示出
位置用文档注释由@开始的文 * 字符串。
字进行说明。文档注释由 * @author zcj
javadoc工具利用Java编译器 * @version 1.0
自动从程序中抽取形成一个 */
类的外部注释文档。
② 浏览javadoc
Java Development Kit (JDK) 中有一个名为javadoc的程序。它可以处理 Java 的源代码文件,并且为 Java 程序产生 HTML 文件形式的外部注释文档。Javadoc 支持一定数目的标记,标识注释文档中各段起始位置的保留字。 以下说明了文档注释中的常用标记:
标记 用于 目的
@author name 类、接口 说明特定某一段程序代码的作者。每一个作者各有一个标记。
@deprecated 类、成员函数(方法) 说明该类的应用程序编程接口 (API) 已被废弃,因此应不再使用。
@exception name 成员函数(方法) 说明由成员函数(方法)发出的异常。一个异常采用一个标记,并要给出异常的完整类名。
@param name 成员函数(方法) 用来说明传递给一个成员函数(方法)的参数,其中包括参数的类型与类和用法。每个参数各有一个标记。
@return description 成员函数(方法) 若成员函数(方法)有返回值,对该返回值进行说明。应说明返回值的类型与类和可能的用途。
@see ClassName 类、接口、成员函数(方法)、字段 在文档中生成指向特定类的超文本链接。可以并且应该采用完全合法的类名。
@version text 类、接口 说明特定一段代码的版本信息。
注释代码的方式很大地影响着程序员编程的工作效率以及所有维护改进代码的后继开发者的工作效率。在软件开发过程中及早注释代码,则会促使程序员在开始撰写代码之前仔细考虑这些代码,从而带来更高的工作效率。而且,当编程者重新阅读数天前或者数星期前所写的代码时,可以很容易地判断出当时是怎么想的,因为这一切都有记录。
3. Java中的词法规范
Java程序是由一些基本元素构成的,它们是一组关键字、空格、常量、变量、运算符、分隔符和注释等。词法规范提供一套编写高效可靠的 Java 代码的标准、约定和指南。它们以安全可靠的软件工程原则为基础,使代码易于理解、维护和增强。而且,通过遵循这些程序设计标准,作为一个 Java 软件开发者的生产效率会有显著提高。经验证明,若从一开始就花时间编写高质量的代码,则在软件开发阶段,对代码的修改就要容易的多。而遵循一套通用的程序设计标准将带来更大的一致性,使软件开发团队的效率明显提高。
当找不到任何规范或指导方针,当规范明显不能适用,运用常识并核实这些基本原则。常识是必不可少的。
Java 程序设计的标准或规范很重要,原因在于它将提高开发团队各成员的代码的一致性。一致性的提高会使代码更易理解,这意味着它更易开发和维护。从而降低了应用程序的总开发成本。必须牢记的是:Java 代码在某开发人员已离开并开始另一个项目之后,会保留相当长的一段时间。因此开发过程中一个很重要的目标就是要确保在开发成员或开发团队之间的工作可以顺利交接,不必花很大的力气便能理解已编写的代码,以便继续维护和改进以前的工作。如果代码难以理解,很有可能被废弃和重写。
⑴.关键字
关键字是Java语言保留的用来控制如何定义程序的特殊标识符,它们用来定义内部的类型、修饰符和控制流。在知识点1中说明一些关键字的定义,它们与运算符、分隔符等一起构成了Java语言的定义,关键字只能被Java语言用来指定目的而不能当作变量名、类名或方法名。
⑵. 标识符
标识符被用作类、方法和变量的名字。一个标识符可由任意顺序的字母、数字、下划线和美元符号组成。字母是大小写敏感的,而且以数字开头的标识符是不合法的。
Java按照标识符的命名约定,遵循以下规则:
⑶.常量
Java中的常值由常量表示,可以有整数
、浮点数
、布尔值
、字符
和字符串
等数据类型。
① 整数常量
整数常量有字节型
(byte)、短整型
(short)、整型
(int)和长整型
(long)四种,分别对应在内存中的存储长度为8位、16位、32位和64位。
例如59、60表示十进制数,它们是非0开头的数值;012表示八进制数,以0开头,换算成十进制数是10;0x12表示十六进制数,以0x开头,换算成十进制数是18。
② 浮点数常量
浮点数表示带有小数部分的十进制数,分为单精度(float)和双精度(double)两种,分别对应在内存中的存储长度为32位和64位。它们可以用标准的或者科学计数法表示,标准计数法通过加“.” 号后跟小数部分组成,例如:4.0、6.56、.789;科学计数法用一个浮点数乘以10的n次方表示,指数部分由E或e后跟一个十进制整数表示,例如:45.94E6、3e10。
Java中的浮点数缺省时为双精度(double),可以在浮点数后面加D、d或不加后缀,例如:3535455.6575d、3.1415926;为了将浮点数强制存储到单精度(float)的变量中,必须在浮点数的后面加F或f后缀,例如:20.43f、-5.67F。
③ 布尔常量
布尔常量只有两种逻辑值:true或false,Java中的true不等于1,且false不等于0,它们只能赋给声明为boolean类型的变量,也可以同布尔运算符一起使用在表达式中。
④ 字符常量
Java中字符编码使用Unicode字符集,通过16位的比特值表示一个字符,并可以转换成整数并被处理,其范围在0到65535之间。
通常有几种表示方式,所有的ASCII字符都可以用单引号扩起来,如’d’、’E’、’@’等;对于不能直接用单引号括起来的字符,需要通过转义来实现,用’\’开头表示转义,表达特殊的字符,如用’\’’表示单引号本身,’\n’表示换行符;还有用八进制或十六进制表示字符的方法,在反斜杠后跟三位八进制数字代表一个字符常量,它的形式为’\ddd’,ddd表示3位八进制数,如’\141’表示字符常量’a’。在反斜杠后跟u是十六进制表示的方式,它的形式为’\uxxxx’,xxxx表示4位十六进制数,如’\u0047’表示字符常量’A’。以下列出了字符的转义序列:
转义序列 对应UNICODE 说明
‘\ddd’ 八进制字符
‘\uxxxx’ 十六进制的UNICODE字符
‘\’’ ‘\u0027’ 单引号
‘\”’ ‘\u0022’ 双引号
‘\\’ ‘\u005c’ 反斜杠
‘\r’ ‘\u000d’ 回车
‘\n’ ‘\u000a’ 换行
‘\f’ ‘\u000c’ 表格符
‘\t’ ‘\u0009’ 水平制表符TAB
‘\b’ ‘\u0008’ 退格
⑤ 字符串常量
字符串常量通过双引号间的任意正文表示的,字符常量中的转义序列在字符串常量中仍然有效,如”Hello World! \n”。Java对每个字符串创建一个String类型的对象,关于String类型的细节在后续博文中讲解。
Java中的字符串常量必须在一行中完成,没有行接续转义序列,但两个字符串可以使用连接符“+”进行连接,允许分行输入。
例如:
String myStr=”I’m glad” +
“ to meet you”
⑷. 运算符
运算符是一种符号,它需要一个或多个参数,进行操作后产生结果,根据参数的不同,可有一元运算符、二元运算符和三元运算符,分别对应一个、两个和三个操作数。有以下几类:
⑸. 分隔符
在Java中分隔符用于定义Java程序的组织和结构,以下说明了它们的作用
符号 名称 作用
() 小括号 在方法的定义和调用时用于包含参数;还可用来定义控制流中表达式优先级;同时也可用来定义强制类型转换。
{} 大括号 用于初始化数组,以及定义类、方法、局部作用域和代码块
[] 中括号 用于定义数组类型,以及递归引用数组值
; 分号 分隔程序代码语句
, 逗号 用于分隔变量声明中的标识符,也可用于连接for循环中的语句
. 点号 用于将包名与子包名及类名分隔开,也用于将引用对象和变量或方法分隔开
⑹. 程序的格式
Java是一种自由格式的语言,语法上不必要对齐或缩进,也能正常工作,像WelcomeApp类的程序可以写在一行上:
public class WelcomeApp{ public static void main(String[] args){System.out.println("欢迎访问Java应用程序");}}
或以自己意愿的方式编排,只要每个词之间用空格、制表符或换行符隔开就行:
Public
Class
WelcomeApp
{
Public
Static
Void
Main
(String[]
args)
{
System.
out.
Println(
"欢迎访问Java应用程序"
);}}
上面的代码编排是正确的,是能够运行的,但是很难阅读。程序的格式虽然不会影响程序的功能,但会影响可读性。程序的格式追求清晰、美观,是程序风格的重要构成因素。体现在以下几方面:
① 空行
空行起着分隔程序段落的作用。空行得体(不过多也不过少)将使程序的布局更加清晰,而且空行不会浪费内存。
② 代码行
一行代码只做一件事情,如只定义一个变量,或只写一条语句。这样的代码容易阅读,并且便于写注释。
if、for、while、do等语句自占一行,执行语句不得紧跟其后。不论执行语句有多少都要加{}。这样可以防止书写失误。
尽可能在定义变量的同时初始化该变量(就近原则)。如果变量的引用处和其定义处相隔比较远,变量的初始化很容易被忘记。如果引用了未被初始化的变量,可能会导致程序错误。这样可以减少隐患。例如:
int width = 10; // 定义并初绐化width
int height = 10; // 定义并初绐化height
int depth = 10; // 定义并初绐化depth
③ 代码行内空格
关键字之后要留空格。如package、void、extends、case 等关键字之后至少要留一个空格,否则无法辨析关键字。如if、for、while等关键字之后应留一个空格再跟左括号‘(’,以突出关键字。
函数名之后不要留空格,紧跟左括号(
,以与关键字区别。(
向后紧跟,)
、,
、;
向前紧跟,紧跟处不留空格。,
之后要留空格,如Method(x, y, z)
。如果;
不是一行的结束符号,其后要留空格,如for (initialization; condition; update)
。
赋值操作符、比较操作符、算术操作符、逻辑操作符、位域操作符,如“=”、“+=” “>=”、“<=”、“+”、“-”、“*”、“/”、“%”、“&&”、“||”、“<<”,“^”等二元操作符的前后应当加空格
。
一元操作符如“!”、“~”、“++”、“--”、“&”等前后不加空格
。象“[]”、“.”这类操作符前后不加空格。
对于表达式比较长的for语句和if语句,为了紧凑起见可以适当地去掉一些空格,如for (i=0; i<10; i++)和if ((a<=b) && (c<=d))。
④ 对齐
程序的分界符‘{’和‘}’应独占一行并且位于同一列,同时与引用它们的语句左对齐。{ }之内的代码块在‘{’右边数个空格处左对齐。
⑤ 长行拆分
代码行最大长度应控制在70至80个字符以内。代码行不宜过长。长表达式要在低优先级操作符处拆分成新行,操作符放在新行之首(以便突出操作符)。拆分出的新行要进行适当的缩进,使排版整齐,语句易读。
⑥ 类的格式
类将数据属性和方法封装在一起,其中方法表示了类的行为或服务。类提供关键字public、protected和private,分别用于声明哪些数据属性和方法是公有的、受保护的或者是私有的。这样可以达到信息隐藏的目的,即让类仅仅公开必须要让外界知道的内容,而隐藏其它的信息。类的格式主要有两种方式:
⑺. 注释
按照该任务中的知识点2
中注释要求进行。
⑻. 变量
变量是Java程序中的基本存储单元,在程序运行中存储单元的数值可以改变,用于记录程序运行的中间结果。变量的定义是由标识符、类型和作用域共同构成的。定义变量建立了变量和内存单元之间的对应关系。
① 声明变量
声明变量的基本格式为:
类型 标识符[=value][,标识符[=value]…];
其中,类型
可以是byte、short、int、long、char、float、double、boolean等,也可以是类名
或接口名
。
例如:
int minValue=10;
int maxValue=100;
声明变量的同时可以对变量进行初始化,没有初始化的变量将自动被设置为0。value是所定义变量的类型的常量。如何在一个类的方法中声明变量,代码如下:
public class WelcomeApp{
public static void main(String[] args){
String strName;
strName="欢迎访问Java应用程序";
System.out.println(strName);
}
}
② 变量的作用域
变量通常定义在一个类中,或者定义在一个方法中,或者定义在由一对花括号包括的代码块中,其作用域时不同的。
类中的变量称为成员变量,在类及类的所有方法中都可以访问之,通过public 、protected、private等修饰符控制其在类外的可见性。局部变量是从变量声明的位置到大括号的结尾,它通常体现在方法体中和由花括号组成的代码块中,或者出现在方法的参数中。
这里需要强调的一点是不能在内部作用域中声明已在外部作用域声明的同名变量,否则将会产生编译错误。例如,以下的代码是非法的。
public class WelcomeApp{
public static void main(String[] args){
String strName=”Hello World ”;
{
String strName="欢迎访问Java应用程序";
}
}
}
4. Java的命令行编译和类加载器执行命令
⑴ Java程序的编译与执行
在了解了Java保留关键字和Java词法规范的基础上就可以进行Java代码编写了,从一个简单的Java应用程序开始,代码如下:
public class WelcomeApp{
public static void main(String[] args){
System.out.println("欢迎访问Java应用程序");
}
}
在文本编辑器中完成Java代码的内容后,将其保存为WelcomeApp.java文件,然后在命令行下通过javac命令进行编译:
javac WelcomeApp.java
如果编译器不返回任何消息,则说明编译成功。编译后生成WelcomeApp.class文件,存储在与源文件相同的目录下(除非指定了其它的目录)。
通过java命令将java字节代码程序装载到java虚拟机(JVM)中解释执行:
java WelcomeApp
虽然这个程序很简单,但它是一个良好开端,接下来进行逐行分析。
① 第一行
public class WelcomeApp{
这一行使用了public
关键字,这是一个访问说明符,描述类的可见性,说明对外可见的。还有两个访问说明符private和protected,它们将在后面的情景任务中介绍;如果一个类被修饰为public,则需要按照这个类的名字保存文件名,这是因为JVM使用文件的名称确定该文件中的public类,所以,在一个文件中只能有一个public类。
第二个关键字使用了class
来声明定义的新类,WelcomeApp是一个合法的标识符,用来标识类,整个类的定义,包括代码和数据都在开括号“{”
和闭括号“}”
之间,将这个类编译为字节代码后,Java虚拟机就能够创建这个类的对象并运行它们。
② 第二行
public static void main(String[] args){
这一行表示在WelcomeApp类中创建了一个方法
,由于Java中的大部分程序都会用到类似的代码行,所以需要仔细地分析第二行的每一部分。
public
: 将行逐字拆分,首先看到public关键字,该访问说明符表示任何类都可以看到这个方法。
static
: 第二个关键字为static,允许无须初始化类的实例就可以直接调用方法,对于main方法,则必须声明为static
,因为在对象实例生成之前,由java解释器调用main方法,这意味main是类方法
,而不是对象方法。
void
: 下一个关键字为void,说明方法的返回类型,如整型、字符串类型等。但本方法只是在屏幕打印,不需返回值
,使用了void 修饰符。
main: 这里说明创建的方法名是main,Java虚拟机在启动应用程序时的会寻找main方法,然后将控制权传递给它。Java编译器可以编译没有main方法的类,但Java解释器无法执行这些类。Java语言是大小写敏感的,main与Main是不同的。
String[] args
: 是方法main后面括号中的参数,其名称为args且类型为String类的实例数组
,表示向main传递包含字符串值的数组。启动应用程序时,字符串值从命令行传递,像java WelcomeApp Hello World这样,“Hello”和“World”就是args数组中的两个字符串。
③ 第三行
System.out.println("欢迎访问Java应用程序");
在此使用java.lang
包中的System
类,关于Java中包的概念的详细描述会在后续博文中说明,这里只是简单的了解;Java中的类库包含在特定Java包(package)中,而在每个Java程序中都内置了java.lang包。其中System 类包含一些有用的类字段(类的成员变量)和方法。它不能被实例化。在 System 类提供的字段中,有标准输入(in
)、标准输出(out
)和错误输出(err
)流。标准输出流的定义为:
public static final PrintStream out
此流已打开并准备接受输出数据,对应于显示器输出
或者由主机环境或用户指定的另一个输出目标。
PrintStream 类中的 println 方法根据Java所运行的环境在屏幕上输出一段字符串,在本文的实例中,字符串输出在Windows的DOS窗口或Linux的终端窗口。println方法自动在字符串的结尾加一个换行符,使得下次输出能够在另一新行上。最后注意这行代码用分号结束。
④ 第四行的大括号结束main方法。
⑤ 第五行的大括号结束WelcomeApp类的定义。
⑵ 诊断编译时和运行时错误
①编译时错误
下面是编译时的常见错误消息,这些消息因使用Java 2 SDK版本的不同而可能会有所不同。
path环境变量设置不对,没有指向javac编译器所在的目录。javac编译器位于JDK安装目录的bin目录下。
如果.java文件包含一个公共类,则该文件的文件名必须和这个类的名称相同。例如,前面代码中的类的定义是:
public class WelcomeApp
则源文件名必须是WelcomeApp.java,否则会得到错误消息。
在每个源文件中只可以声明一个顶级非静态的公共类,要求这个类的名称必须与源文件名相同。如果在一个源文件中声明了多个公共类,则编译时会得到错误消息。
②运行时错误
这个通常表明在命令行中指定的类名的拼写错误,Java编程语言是区分大小写的。
这个表示解释器执行时,在类中没有一个静态的main方法。也可能有一个main 方法,但没有使用static关键字声明此方法,或者该方法的参数声明存在错误。
在控制台界面的聊天系统中,聊天信息通过字符串来表示,通过编写Java代码,将字符串信息“您好,很高兴认识您。”
输出到控制台(Console),代码如下所示:
package cn.ischoolcode.chatcui; // 关键字package用于声明一个包名
/**
* 该类为聊天系统的客户端,用于在CUI屏幕上显示消息
* @version 1.0,2023 年 3 月 16 日
* @author zcj
*/
public class Client {
/**
* 声明一个 main 方法
*/
public static void main(String arg[]) {
System.out.println("客户端张三说:" + "您好,很高兴认识您。"); // 输出聊天消息
}
}
第1行代码为包的声明,定义类似文件夹
的方式存放Java文件,在以后的情景任务中还会进一步讲解。其他行代码与前面知识点中解释分析的含义相同。
将子任务1中的代码保存为文件名是Client.java的源文件。由于代码行的首行指定了包名:cn.ischoolcode.chatcui
,如果当前路径是:D:\zcj\workspace
,则实际的保存的源代码文件路径为:D:\zcj\workspace\cn\ischoolcode\chatcui\Client.java
。
由于存在中文信息的字符串,而Java语言默认是按照UTF-8的字符集的进行处理的,如果本地操作系统的默认字符集可能为GB2312或GBK,则编译或运行时将出现乱码,需要对程序的源代码做特殊的处理。保存源码文件时按UTF-8
字符编码存储,如图所示:
中文处理涉及到汉字的编码,英文的字母编码通常使用ASCII编码,它是单字节的;汉字编码使用GB2312编码,它是双字节的。如果按照单字节处理汉字,就会出现乱码。为了解决这种字符串的国际化问题,不管是西文字母,还是汉字,或者其它国家的文字,都采用Unicode编码机制对其统一编码,而这种编码采用的是双字节。Java编程的字符串编码默认为Unicode(UTF-8),根据编辑器的设置不同,Java源文件可以为不同的字符编码。在编译Java源程序之前,需要将源程序的本地语言(native)编码转换为Unicode编码,转换后的中文的Unicode编码使用格式\uxxxx(UTF-16)表示。在涉及Java的资源文件的后续情景任务的相关内容时,还会进一步的介绍解决资源包的中文问题。通过JDK提供的专用工具native2ascii完成此功能。运行JDK的命令如图所示:
如果省略-encodeing的本地参数选项,native2ascii自动取当前操作系统的默认字符编码为本地编码参数,运行后将输出文件temp.java中的内容复制,然后粘贴覆盖Client.java文件中原来的内容,中文部分替换如下:
System.out.println("\u5ba2\u6237\u7aef\u5f20\u4e09\u8bf4:" + "\u60a8\u597d\uff0c\u5f88\u9ad8\u5174\u8ba4\u8bc6\u60a8\u3002");
从中可以看到,西文字符没有变化,而中文字符变成了\uxxxx格式。接下来将覆盖后的Java源文件Client.java按ANSI
字符编码存储,如图所示:
接下来进行编译。执行javac
,如图所示:
如果在命令行提示符下没有出现任何信息,说明编译成功,生成了Client.class文件。
由类加载器java解释执行Client类字节码,如图所示:
从这个简单Java应用程序可以看出,Java的代码必须在已命名的类中,将这段文本代码保存在Client.java的文件中,而且文件名的大小写必须与类名一致。字节代码只是Client应用程序的一种中间结果,它里面由java虚拟机(JVM)机器语言指令组成。当需要运行这个程序时,通过Java运行器来装载编译后的这个新类并执行。
Java程序代码在计算机上实际运行之前要经过几次测试。Java虚拟机将代码输入到一个字节码校验器,以测试代码段格式并检查非法代码段,判断它们是否是伪造指针、违反对象访问权限或者试图改变对象类型的代码。
所有通过网络导入的类文件都要经过字节码校验器。
字节码的校验过程是字节码校验器对Java程序代码进行四次校验。它确保代码符合Java虚拟机规范并且不违反系统的完整性。如果校验器在完成四次校验后未返回错误消息,则可保证以下情况:
在后续情景中将会深入的学习怎样进行窗口化应用程序设计和编程,现在只是预演一下它的应用。
窗口化应用程序也称为桌面应用程序,它运行在本地操作系统中,基于GUI的Java系统类。从javax.swing.JFrame类派生一个新类MemberFrame,形成框架窗口,然后定义应用类MemberApp,在其main()方法中实例化该框架窗口,最后显示,如图所示,代码如下:
1: package cn.ischoolcode.gui;
2:
3: import java.awt.*;
4: import javax.swing.*;
5:
6: class MemberFrame extends JFrame{
7: JPanel contentPane;
8: JPanel jPanel=new JPanel();
9: BorderLayout borderLayout = new BorderLayout();
10: JButton jButton= new JButton();
11: JButton jButtonIconOpen= new JButton();
12: JButton jButtonIconClose= new JButton();
13: JButton jButtonIconHelp= new JButton();
14: JToolBar jToolBar = new JToolBar();
15: JLabel statusBar = new JLabel();
16:
17: public MemberFrame()
18: {
19: contentPane = (JPanel) getContentPane();
20: contentPane.setLayout(borderLayout);
21: jPanel.setLayout(new GridBagLayout());
22: setSize(new Dimension(400, 300));
23: setTitle("会员管理系统");
24: statusBar.setText(" ");
25: jButton.setText("确认");
26: jPanel.add(jButton);
27: jButtonIconOpen.setToolTipText("打开文件");
28: jButtonIconClose.setToolTipText("关闭文件");
29: jButtonIconHelp.setToolTipText("帮助");
30: jToolBar.add(jButtonIconOpen);
31: jToolBar.add(jButtonIconClose);
32: jToolBar.add(jButtonIconHelp);
33: statusBar.setText("显示状态信息");
34: contentPane.add(jPanel,BorderLayout.CENTER);
35: contentPane.add(jToolBar, BorderLayout.NORTH);
36: contentPane.add(statusBar, BorderLayout.SOUTH);
37: }
38: }
39:
40: public class MemberApp {
41: public static void main(String args[])
42: {
43: MemberFrame frame = new MemberFrame();
44: frame.setVisible(true);
45: }
46: }
第一行说明本应用程序的Java类放在包名为cn.ischoolcode.gui的包里面,3、4行导入包java.awt和javax.swing中的系统类,用于创建用户界面和绘制图形图像。第6行到38行用于MemberFrame类的声明,以建立图形框架类。第40行到46行建立了应用类MemberApp。
博文最后更新时间: