精华区 [关闭][返回]

当前位置:网易精华区>>讨论区精华>>编程开发>>● Java>>新手上路>>Java语言入门>>送给想学Java的朋友!—Java语言入门之五[转]

主题:送给想学Java的朋友!—Java语言入门之五[转]
发信人: sunrisepro(SunRise)
整理人: zjxyz(2002-01-21 08:12:56), 站内信件

                                         第 四 章 Java应 用 程 序 的 基 本 框 架
学 习 一 门 新 语 言 最 好 是 先 看 几 个 简 单 的 程 序 例 子。 下
面 我 们 将 看 到 几 个 非 常 基 本 的 程 序 例 子。
4.1 Java应 用 程 序 的 运 行 环 境
Java应 用 程 序 是 指 可 以 独 立 运 行 在Java虚 拟 机 上 的 程 序,
它 是 一 种 中 间 代 码(byte-code?copy;。 比 如 你 的 应 用 程 序 叫my.java

程 序 里 有 一 个 名 称 为app1的 类, 用Javac或 其 它 编 译 器, 编 译
后 将 会 生 成app1.class, 则 在 命 令 行 状 态 下 输 入:java app1就 可
以 运 行 此 程 序。 注 意, 用java 命 令 运 行 的 类 必 须 有main函 数,
否 则 不 能 执 行。 与 普 通java应 用 程 序 不 同 的 另 一 种 另 一 种Java程

序 叫Java Applet。 我 们 把 它 译 成Java小 程 序, 这 种 程 序 后 缀 也
是.class, 但 它 不 能 直 接 在java虚 拟 机 上 运 行, 也 就 是 输 入java
*.class不 能 运 行, 这 种 程 序 里 可 以 没 有main函 数, 它 必 须 由
某 个 浏 览 器 来 运 行, 比 如Appletviewer或 Netscape2.02以 上 等。 这
种 程 序 我 们 将 在 后 面 章 节 中 介 绍。
4.2 最 简 单 的Java程 序 解 释
让 我 们 来 看 一 看 最 简 单 的Java应 用 程 序 例 子, 来 理 解 一
下 它 的 结 构:        Filename:1.java
class myfirst{ public static void main(String args[ ])                          {                               System.out,
println
("This is my first Java Application");                                }                }
这 就 是 一 个 完 整 的 Java 应 用 程 序, 将 它 编 译:                Javac    1.java
在 当 前 目 录 下, 它 将 生 成myfirst.class 文 件, Java myfirst 屏 幕
上 将 会 输 出:This is my first Java Application
让 我 们 来 一 步 一 步 分 析 每 句 话 含 义    (1?copy; class myfirst
                 这 一 行 用 关 键 词class来 定 义 名 为myfirst的 新 类,myfirst是 新
类 的 名 称, 必 须 是 一 个 有 效 的 标 识 符, 有 效 标 识 符 定 义 请
见 程 序 设 计 基础章 节。 类 的 说 明 包 括 数 据 说 明 和 成 员 函 数
说 明, 都 放 在 类 后 面 的 大 括 号 里 面。 一 般 类 定 义 如 下:            
class 类 名 称{                         数 据 定 义;                   函 数 定 义;                                  }       
         ( 2 )public static void main (String args [ ] )                 public是 一 个
表 示 访 问 权 限 的 关 键 字, 表 示 此 成 员 函 数 是 公 有 的, 可 以
被 其 他 类 直 接 调 用, 包 括java解 释 器。 相 对 应 的 关 键 字 有private
和protected,friend。private表
示 只 能 被 本 类 访 问,protected表 示 只 能 被 子 类 访 问,friend是
缺 省 的 访 问 权 限, 表 示 能 被 本 包(package)中 任 意 类 访 问, 对
其 它 包 中 的 类 是 不 可 访 问 的。           static 表 示main 成 员 函 数 在myfir
st类
的 所 有 对 象 中 是 唯 一 的, 因 此 如 果 本 程 序 生 成 另 一 个myfirst类

对 象, 调 用 的 main 函 数 将 是 同 一 个 函 数。              void 表 示 main 函
数 没 有 返 回 值, 如 果 有 返 回 类 型 值, 则 可 加 上interger 或boolean
诸 如 此 类, 对 于 有 返 回 值 的 函 数, 其 函 数 实 体 的 最 后 应 加
上return语 句。          main 这 个 函 数 是 这 运 行 应 用 程 序 的 入 口 点,
因 此 编 写 应 用 程 序 是 必 须 有main( )函 数, 且 是 唯 一 的。
(3?copy; System.out.println 一 句 这 一 句 是main函 数 里 的 功 能
语 句, 是 调 用Java里 System 包 里 的out 类 的println成 员 函 数, 是
标 准 输 入 输 出。
4.3 Java应 用 程 序 参 数 的 传 递
        Java语 言 很 类 似C和C++语 言。 在C语 言 里, 通 过 在 命 令 行 输
入 参 数,C程 序 可 由main函 数 读 入 这 ?copy; 参 数,java程 序 也 一
样, 请 看 下 面 程 序:        Filename:2.java
        class My2 {              public static void main (String args[ ] )                       {                      
int arc = args.length;                   if (arc>0)                           {                       for (int i =0;i<arc;i
++)
System.out.println (args[i] ) } else { System.out
.println
("Application have no args!"); } } }
编 译:javac 2.java 将 在 本 目 录 下 生 成My2.class文 件。
运 行:java My2 输 出: Application have no args!
运 行:java My2 arg1 arg2 arg3 输 出: arg1 arg2 arg3 这 说 明,java里
参 数 的 传 递 是 这 样 的, 命 令 行 里 类 名 后 第 一 个 参 数 放 在args[0
]里,
第 二 个 参 数 放 在args[1]里, 以 此 类 推。
4.4 建 立 窗 口Java程 序 基 本 框 架
Frame介 绍 在Java语 言 里,Frame类 的 功 能 是 创 建 图 形 用 户 界
面(GUI)的 基 本 窗 口。 在 典 型 浏 览 器 里, Frame类 是 显 示GUI的 父
类。
类 的 层 次 结 构 如 下: java.lang.Object java.awt.Component java.awt.Co
ntainer
java.awt.Window java.awt.Frame
Frame是 从 没 有 边 框 和 菜 单 条 的 空 白 窗 口 ?copy; 充 来 的。
这 种 窗 口 主 要 用 在 弹 出 式 窗 口 方 式 下。 Frame给 窗 口 一 个 边
框, 一 个 布 局 和 一 个 窗 口 条。
你 可 以 通 过 创 建 自 己 的 多 个Frame来 创 建 图 形 用 户 界 面 的
应 用 程 序。 我 们 已 知 道 怎 样 建 立 独 立 的java应 用 程 序, 那 么
怎 样 将 各 种 迷 人 的 图 形 结 合 在 一 块 呢? 我 们 通 过 建 立 一
个Frame来 实 现 这 个 功 能。Frame让 我 们 访 问 窗 口, 和applet工 作
区 有 许 多 相 同 的 地 方。 下 面 是 一 个 小 的 应 用 程 序, 它 弹 出
一 个 框 架 并 且 在 框 架 里 显 示 信 息。(信 息 可 以 是 命 令 行 参
数, 也 可 以 是 缺 省 的 信 息?copy;。 如 果 你 在 窗 口 里 点 一 下,
程 序 退 出。
基 本 框 架 程 序 import java.awt.*;
/* * Memo.java *A simple stand-alone graphical application */
public class Memo extends Frame { publc String motd;
public Memo(String s) { //set our title super("Memo Frame");
motd = s; resize(300,300); }
public Memo() { this("This is a Memo"); }
public void paint(Graphics g) { g.drawString(motd,15,15); g.drawString(
"Click
anywhere to Exit",15,25); }
public void start() { show(); }
public boolean mouseDown(Event e,int x,int y) { //hide the window
hide(); //free up system resources dispose(); //Quit the app. Syst
em.exit(0);
return false; }
public static void main(String args[]) { Memo m; if (args.length
> ) {                        m = new Memo(args[0]);          }               else {                  m = new Memo();                 }
                m.start();      } }
将Frame联 系 起 来 l 熟 悉 的 函 数 paint()和mouseDown(), 看 起 来
有 点 眼 熟。 这 ?copy; 函 数 与applet的 函 数 一 样。 实 际 上, 一 个frame

包 含 各 种GUI组 件 与applet的 形 式 一 样。 另 一 个 熟 悉 的 函 数 是start
()。
这 个 函 数 并 不 必 要, 因 为 我 们 没 有 覆 盖 任 何 已 存 在 的 函
数。 但 你 想 继 承applet编 程 的 风 格, 你 还 是 可 以 使 用start(),stop()
,init()与destroy()等
函 数。
l 新 函 数 我 们 熟 悉 的 函 数start()调 用 了show()。show()函 数 是Window类

的 继 承, 它 显 示Fame及 其 所 有 组 件。 在mouseDown()函 数 里 我 们
看 到 两 个 函 数:hide()和dispose()。hide()只 简 单 地 使Frame不 可 见。
你 可 以 在 任 何 时 候 调 用 它 来 隐 藏 窗 口。 dispose()函 数 释 放
由Frame占 有 的 系 统 资 源。 只 有 在 你 不 需 要Frame时 才 调 用 它。
l 构 造 函 数 Memo例 子 还 包 含 了 一 个 新 函 数Memo()。 其 实 这
个 类 有 两 个Memo()函 数! 任 何 与 类 名 相 同 的 函 数 都 是 构 造 函
数。 它 在 创 建 一 个 新 对 象 时 被 调 用。 你 可 以 认 为 它 是 一 个
对 象 的init()初 始 化 函 数。 为 什 么 需 要 两 个 构 造 函 数 呢? 有
了 两 个 构 造 函 数, 我 们 可 以 利 用 多 态 性 的 优 点, 有 两 种 方
法 创 建 一 个 新Memo对 象。 我 们 可 以 简 单 的 创 建 使 用 缺 省 信
息 的Memo对 象: m = new Memo(); 或 者, 我 们 可 以 自 己 提 ?copy; 信
息: m = new Memo("Our message");
Frame控 制 本 程 序 的 最 后 功 能 是 在main()里 建 立 并 显 示frame。
它 由 以 下 两 步 实 现: //Step 1 m = new Memo();
//Step 2 m.start(); 第 一 步 初 始 化memo对 象。 我 们 象 操 作 其 它
对 象 一 样 操 作m。 为 显 示frame, 我 们 需 要 调 用 show()。 这 在 第
二 步 里 实 现。 另 一 个 要 注 意 的 是 程 序 的健 壮 性: 我 们 基 本
的frame里 没 有 包 含 处 理 标 准 WINDOW_DESTROY消 息 的 函 数。 这 样,
你 将 不 能 在 窗 口 的 控 制 菜 单 里 选 中"Quit"或"Exit&quo
t;。
为 了 增 加 这 个 功 能, 你 需 要 增 加 以 下 的 处 理 程 序:
public boolean handleEvent (Event e) {  if (e.id == Event.WINDOW_DESTROY)
{               dispose();              System.exit(1);                 return true;    }       else {          //Go ahead
and do what we normally would have done                 return super.handleEvent(e);
        } }
菜 单 图 形 界 面 依 靠 菜 单 来 指 导 用 户 操 作。 设 计 独 立 的Java应
用 程 序 时,Java提 ?copy; 创 建 和 使 用 菜 单 的 直 接 方 法。 象 其
它 组 件 一 样,new将 创 建 一 个 菜 单:
Menu optionMenu; optionsMenu = new Menu("Options");
菜 单 项 一 ?copy; 你 创 建 了 一 个 菜 单, 你 可 以 使 用add()来
组 建 菜 单 项:
optionsMenu.add(new MenuItem("Option1"); optionsMenu.add(new
MenuItem("Option2");
菜 单 事 件 当 你 选 中 某 个 菜 单 项 时, 你 创 建 此 菜 单 项 的
字 符 ?reg; 将 在 事 件 中 返 回。 你 可 以 象 测 试 按 钮 选 择 一 样
测 试 菜 单 选 择:
public boolean action (Event e, Object arg) {   ...     if (e.target instanceof
MenuItem) {             System.out.println((String) arg);       }               ... }
其 它 菜 单 项 除 了 上 面 描 述 的 简 单 菜 单 项 外, 你 还 可 增
加CheckBox菜 单 项, 分 割 线, 以 及 子 菜 单。 下 面 是 一 ?copy; 例
子: Menu m,n; m = new Menu("Examples"); m.add(new MenuItem("
Basic"));
m.add(new MenuItem("Simple"));
//add a separator m.add(new MenuItem("-"));
//add a Checkbox item m.add(new CheckboxMenuItem("Check"));
//add a submenu n = new Menu("More Examples"); n.add(new MenuItem(
"Sub
Basic")); n.add(new MenuItem("Sub Simple")); m.add(n);
菜 单 条 你 创 建 好 菜 单 后, 你 应 将 ?reg; 放 在 应 用 程 序 的
菜 单 条 上: mb = new Menubar();
mb.add(m); mb.add(optionsMenu);
然 后 你 可 为applet设 置 菜 单 条: setMenuBar(mb);
4.5 独 立 应 用 程 序 例 子
为 了 看 一 个 更 复 杂 的 独 立 的 图 形 界 面 应 用 程 序, 下 面
有 一 个 数 字 转 换 的 例 子:
import java.awt.*;
public class d2x extends Frame {        int decimalValue= 0;    String baseXValue
= new String ("0");   TextField dDisplay,xDisplay;
        //d2x constructor       public d2x() {          super("Decimal Converter");//
set
the title of the frame          MenuBar mb = new MenuBar();             Button d2Binary
= new Button("Binary");               Button d2Octal = new Button("Octal&
quot;);
                Button d2Hex = new Button("Hex");             Button d2Base36 = new Button
("Base36");
                Panel p1 = new Panel();                 Panel p2 = new Panel();                 Panel p3 = new Panel()
;
                //add a simple menu             Menu m = new Menu("Application");
                m.add(new CheckboxMenuItem("Base 36 Active");                 m.add(new MenuIt
em("Exit"));
                //add menu to menubar           mb.add(m);                      setMenuBar(mb);//install this
menu bar in the frame
                //Add buttons to their own panel                p3.setLayout(new FlowLayout());
                p3.add(d2Binary);               p3.add(d2Octal);                p3.add(d2Hex);          p3.add(d2Base36);
                //Add text fields               Label dLabel = new Label("Enter Deecimal:
");                Label xLabel = new Label("Converted Value: ");                dDispl
ay
= new TextField(integer.toString(decimalValue),7);              xDisplay = new TextFiel
d(baseXValue,32);
                xDisplay.setEditable(false);            p1.setLayout(new FlowLayout(FlowLayout.LEFT
));
                p2.setLayout(new FlowLayout(FlowLayout.LEFT));          p1.add(dLabel);                 p1.add(
dDisplay);
                p2.add(xLabel);                 p2.add(xDisplay);
                //Add the panels                add("North",p1);              add("Center",p2)
;
                add("South",p3);      }//end d2x constructor
public void start() {   resize(400,150);        show(); }
public void updateXDisplay() {  xDisplay.setText(baseXValue); }
public boolean handleEvent(Event evt) {         if (evt.targt intanceof MenuItem)
{               if ("Exit".equals(((MenuItem)evt.target).getLabel())) {                       hid
e();
                        dispose();                      System.exit(0);                         return false;           }               retrun true;    }
        else if (evt.target instanceof Button) {                String whick = ((Button)evt.targ
et).getLabel();
                if (whick.equals("Binary")) {                         decimalValue = Integer.parseInt
(dDisplay.getText());
                        baseXValue = Interger.toString(decimalValue,2);                 }               if (whick.equals(&q
uot;Octal"))
{                       decimalValue = Integer.parseInt(dDisplay.getText());                    baseXValue
= Interger.toString(decimalValue,8);            }               if (whick.equals("Hex")
)
{                       decimalValue = Integer.parseInt(dDisplay.getText());                    baseXValue
= Interger.toString(decimalValue,16);           }               if (whick.equals("36")
)
{                       decimalValue = Integer.parseInt(dDisplay.getText());                    baseXValue
= Interger.toString(decimalValue,36);           }               updateXDisplay();               return
true;   }       return false; }
public static void main(String args[]) {        d2x m = new d2x();      m.start();
        } }
输 出 结 构 如 图:
本 章 小 结:
1.java有 两 种 类 型 的 应 用 程 序, 一 种 是 直 接 运 行 在java虚
拟 机 上, 用java命 令 执 行; 另 一 种 运 行 在 浏 览 器 里, 由 浏 览
器 调 用 执 行, 一 般 称 它 为Applet小 程 序。 本 书 主 要 讨 论 第 一
种 应 用 程 序。 2.java应 用 程 序 是 由 类 组 成 的, 而 且 用java命 令
行 执 行 的 类 必 须 有main入 口 函 数。 3.与C语 言 相 似,java程 序 也
可 由 命 令 行 传 递 给main函 数 参 数。 4.基 本 窗 口java程 序 的 基 本
类 是Frame。 利 用 它 可 以 很 方 便 地 建 立 图 形 用 户 界 面 程 序。


----
让我们一起来繁荣“中国高校编程联盟”!
http://www.mynetech.com
http://www.javaness.com
小组在www.smiling.com.cn也有活动基地

[关闭][返回]