您的位置:寻梦网首页编程乐园Java天地Core JavaJava基础教程
Java 天地

Java基础教程

第一章 Java的产生与特点
第二章 Java程序编译与运行环境
第三章 Java程序设计基础
第四章 Java应用程序的基本结构
第五章 Java的类
第六章 Java图形用户接口
第七章 Java的多线程
第八章 Java的“异常”
第九章 Java的输入输出操作

第四章 Java应用程序的基本结构

学习一门新语言最好是先看几个简单的程序例子。 下面我们将看到几个非常基本的程序例子。


4.1 Java应用程序的运行环境

Java应用程序是指可以独立运行在Java虚拟机上的程序, 它是一种中间代码(byte-code)。 比如你的应用程序叫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) class myfirst 这一行用关键词class来定义名为myfirst的新类, myfirst是新类的名称, 必须是一个有效的标识符, 有关效标识符定义请见程序设计基础章节。 类的说明包括数据说明和成员函数说明, 都放在类后面的大括号里面。 一般类定义如下: class 类名称{数据定义;函数定义;}

(2) public static void main (String args [ ] ) public是一个表示访问权限的关键字, 表示此成员函数是公有的, 可以被其他类直接调用, 包括java解释器。 相对应的关键字有private和protected, friend。 private表示只能被本类访问, protected表示只能被子类访问, friend是缺省的访问权限, 表示能被本包(package)中任意类访问, 对其它包中的类是不可访问的。 static表示main成员函数在myfirst类的所有对象中是唯一的, 因此如果本程序生成另一个myfirst类对象, 调用的main函数将是同一个函数。 void表示main函数没有返回值, 如果有返回类型值, 则可加上interger 或 boolean诸如此类, 对于有返回值的函数, 其函数实体的最后应加上return语句。 main这个函数是这运行应用程序的入口点, 因此编写应用程序是必须有main( ) 函数, 且是唯一的。

(3) System.out.println 一句这一句是main函数里的功能语句, 是调用Java里System 包里的out类的 println成员函数, 是标准输入输出。


4.3 Java应用程序参数的传递

Java语言很类似C和C++语言。 在C语言里, 通过在命令行输入参数, C程序可由main函数读入这 )参数, java程序也一样, 请看下面程序:

  Filename:My2.java 
  public 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.Container java.awt.Window java.awt.Frame

Frame是从没有边框和菜单条的空白窗口填充来的。 这种窗口主要用在弹出式窗口方式下。 Frame给窗口一个边框, 一个布局和一个窗口条。

你可以通过创建自己的多个Frame来创建图形用户界面的应用程序。 我们已知道怎样建立独立的java应用程序, 那么怎样将各种迷人的图形结合在一块呢? 我们通过建立一个Frame来实现这个功能。 Frame让我们访问窗口, 和applet工作区有许多相同的地方。 下面是一个小的应用程序, 它弹出一个框架并且在框架里显示信息。 (信息可以是命令行参数, 也可以是缺省的信息)。 如果你在窗口里点一下, 程序退出。

基本框架程序

  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. 
      System.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联系起来的函数 paint()和mouseDown(), 看起来有点眼熟。 这些函数与applet的函数一样。 实际上, 一个frame包含各种GUI组件与applet的形式一样。 另一个熟悉的函数是start()。 这个函数并不必要, 因为我们没有覆盖任何已存在的函数。 但你想继承applet编程的风格, 你还是可以使用start(), stop(), init()与destroy()等函数。

新函数: 我们熟悉的函数start()调用了show()。 show()函数是Window类的继承, 它显示Frame及其所有组件。 在mouseDown()函数里我们看到两个函数: hide()和dispose()。 hide()只简单地使Frame不可见。 你可以在任何时候调用它来隐藏窗口。 dispose()函数释放由Frame占有的系统资源。 只有在你不需要Frame时才调用它。

构造函数: Memo例子还包含了一个新函数Memo()。 其实这个类有两个Memo()函数! 任何与类名相同的函数都是构造函数。 它在创建一个新对象时被调用。 你可以认为它是一个对象的init()初始化函数。 为什么需要两个构造函数呢? 有了两个构造函数, 我们可以利用多态性的优点, 有两种方法创建一个新Memo对象。 我们可以简单的创建使用缺省信息的Memo对象:

  m = new Memo(); 

或者, 我们可以自己提供信息:

  m = new Memo("Our message"); 

Frame控制本程序的最后功能是在main()里建立并显示frame。 它由以下两步实现:

  m = new Memo();   //Step 1 
  m.start();   //Step 2 

第一步初始化memo对象。 我们象操作其它对象一样操作m。 为显示frame, 我们需要调用show()。 这在第二步里实现。 另一个要注意的是程序的健壮性: 我们基本的frame里没有包含处理标准 WINDOW_DESTROY消息的函数。 这样, 你将不能在窗口的控制菜单里选中"Quit"或"Exit"。 为了增加这个功能, 你需要增加以下的处理程序:

  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提供创建和使用菜单的直接方法。 象其它组件一样, new将创建一个菜单:

  Menu optionMenu; 
  optionsMenu = new Menu("Options"); 

菜单项: 一旦你创建了一个菜单, 你可以使用add()来组建菜单项:

  optionsMenu.add(new MenuItem("Option1"); 
  optionsMenu.add(new MenuItem("Option2"); 

菜单事件当你选中某个菜单项时, 你创建此菜单项的字符串将在事件中返回。 你可以象测试按钮选择一样测试菜单选择:

  public boolean action (Event e, Object arg) { 
    ... 
    if (e.target instanceof MenuItem) { 
      System.out.println((String) arg); 
    } 
    ... 
  }

其它菜单项除了上面描述的简单菜单项外, 你还可增加CheckBox菜单项, 分割线, 以及子菜单。 下面是一些例子:

  Menu m, n; 
  m = new Menu("Examples"); 
  m.add(new MenuItem("Basic")); 
  m.add(new MenuItem("Simple")); 
  m.add(new MenuItem("-")); //add a separator 
  m.add(new CheckboxMenuItem("Check")); //add a Checkbox item
  n = new Menu("More Examples"); 
  n.add(new MenuItem("Sub Basic"));//add a submenu 
  n.add(new MenuItem("Sub Simple")); 
  m.add(n); 

菜单条: 你创建好菜单后, 你应将其放在应用程序的菜单条上:

  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"); 
      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 MenuItem("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: "); 
      dDisplay = new TextField(integer.toString(decimalValue), 7); 
      xDisplay = new TextField(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())) { hide(); dispose(); System.exit(0); return false; } retrun true; } else if (evt.target instanceof Button) { String whick = ((Button)evt.target).getLabel(); if (whick.equals("Binary")) { decimalValue = Integer.parseInt(dDisplay.getText()); baseXValue = Interger.toString(decimalValue, 2); } if (whick.equals("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。 利用它可以很方便地建立图形用户界面程序。


(作者: 袁小春  来源: 不详)