|
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。 利用它可以很方便地建立图形用户界面程序。 (作者: 袁小春 来源: 不详) |