学习一门新语言最好是先看几个简单的程序例子。下面我们将看到几个非常基本的程序例子。
4.1Java应用程序的运行环境
Java应用程序是指可以独立运行在Java虚拟机上的程序,它是一种中间代码(byte-code?copy;。比如你的应用程序叫my.java,程序里有一个名称为app1的类,用Javac或其它编译器,编译后将会生成app1.class,则在命令行状态下输入:javaapp1就可以运行此程序。注意,用java命令运行的类必须有main函数,否则不能执行。与普通java应用程序不同的另一种另一种Java程序叫JavaApplet。我们把它译成Java小程序,这种程序后缀也是.class,但它不能直接在java虚拟机上运行,也就是输入java*.class不能运行,这种程序里可以没有main函数,它必须由某个浏览器来运行,比如Appletviewer或Netscape2.02以上等。这种程序我们将在后面章节中介绍。
4.2最简单的Java程序解释
让我们来看一看最简单的Java应用程序例子,来理解一下它的结构:Filename:1.javaclassmyfirst{publicstaticvoidmain(Stringargs){System.out,println(\"ThisismyfirstJavaApplication\");}}这就是一个完整的Java应用程序,将它编译:Javac1.java在当前目录下,它将生成myfirst.class文件,Javamyfirst屏幕上将会输出:ThisismyfirstJavaApplication让我们来一步一步分析每句话含义(1?copy;classmyfirst这一行用关键词class来定义名为myfirst的新类,myfirst是新类的名称,必须是一个有效的标识符,有效标识符定义请见程序设计基础章节。类的说明包括数据说明和成员函数说明,都放在类后面的大括号里面。一般类定义如下:class类名称{数据定义;函数定义;}
(2)publicstaticvoidmain(Stringargs)public是一个表示访问权限的关键字,表示此成员函数是公有的,可以被其他类直接调用,包括java解释器。相对应的关键字有private和protected,friend。private表示只能被本类访问,protected表示只能被子类访问,friend是缺省的访问权限,表示能被本包(package)中任意类访问,对其它包中的类是不可访问的。
static表示main成员函数在myfirst类的所有对象中是唯一的,因此如果本程序生成另一个myfirst类对象,调用的main函数将是同一个函数。void表示main函数没有返回值,如果有返回类型值,则可加上interger或boolean诸如此类,对于有返回值的函数,其函数实体的最后应加上return语句。main这个函数是这运行应用程序的入口点,因此编写应用程序是必须有main函数,且是唯一的。(3?copy;System.out.println一句这一句是main函数里的功能语句,是调用Java里System包里的out类的println成员函数,是标准输入输出。
4.3Java应用程序参数的传递
Java语言很类似C和C++语言。在C语言里,通过在命令行输入参数,C程序可由main函数读入这?copy;参数,java程序也一样,请看下面程序:Filename:2.javaclassMy2{publicstaticvoidmain(Stringargs){intarc=args.length;if(arc>0){for(inti=0;i){m=newMemo(args[0]);}else{m=newMemo;}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=newMemo;或者,我们可以自己提?copy;信息:m=newMemo(\"Ourmessage\");Frame控制本程序的最后功能是在main里建立并显示frame。它由以下两步实现://Step1m=newMemo;//Step2m.start;第一步初始化memo对象。我们象操作其它对象一样操作m。为显示frame,我们需要调用show。这在第二步里实现。另一个要注意的是程序的健壮性:我们基本的frame里没有包含处理标准WINDOW_DESTROY消息的函数。这样,你将不能在窗口的控制菜单里选中\"Quit\"或\"Exit\"。为了增加这个功能,你需要增加以下的处理程序:publicbooleanhandleEvent(Evente){if(e.id==Event.WINDOW_DESTROY){dispose;System.exit(1);returntrue;}else{//Goaheadanddowhatwenormallywouldhavedonereturnsuper.handleEvent(e);}}
菜单图形界面依靠菜单来指导用户操作。设计独立的Java应用程序时,Java提?copy;创建和使用菜单的直接方法。象其它组件一样,new将创建一个菜单:MenuoptionMenu;optionsMenu=newMenu(\"Options\");菜单项一?copy;你创建了一个菜单,你可以使用add来组建菜单项:optionsMenu.add(newMenuItem(\"Option1\");optionsMenu.add(newMenuItem(\"Option2\");菜单事件当你选中某个菜单项时,你创建此菜单项的字符?reg;将在事件中返回。你可以象测试按钮选择一样测试菜单选择:publicbooleanaction(Evente,Objectarg){...if(e.targetinstanceofMenuItem){System.out.println((String)arg);}...}其它菜单项除了上面描述的简单菜单项外,你还可增加CheckBox菜单项,分割线,以及子菜单。下面是一?copy;例子:Menum,n;m=newMenu(\"Examples\");m.add(newMenuItem(\"Basic\"));m.add(newMenuItem(\"Simple\"));
//addaseparatorm.add(newMenuItem(\"-\"));//addaCheckboxitemm.add(newCheckboxMenuItem(\"Check\"));//addasubmenun=newMenu(\"MoreExamples\");n.add(newMenuItem(\"SubBasic\"));n.add(newMenuItem(\"SubSimple\"));m.add(n);菜单条你创建好菜单后,你应将?reg;放在应用程序的菜单条上:mb=newMenubar;mb.add(m);mb.add(optionsMenu);然后你可为applet设置菜单条:setMenuBar(mb);
4.5独立应用程序例子
为了看一个更复杂的独立的图形界面应用程序,下面有一个数字转换的例子:importjava.awt.*;
publicclassd2xextendsFrame{intdecimalValue=0;StringbaseXValue
=newString(\"0\");TextFielddDisplay,xDisplay;
//d2xconstructorpublicd2x{super(\"DecimalConverter\");//setthe
titleoftheframeMenuBarmb=newMenuBar;Buttond2Binary=new
Button(\"Binary\");Buttond2Octal=newButton(\"Octal\");Buttond2Hex=
newButton(\"Hex\");Buttond2Base36=newButton(\"Base36\");Panelp1=new
Panel;Panelp2=newPanel;Panelp3=newPanel;
//addasimplemenuMenum=newMenu(\"Application\");m.add(new
CheckboxMenuItem(\"Base36Active\");m.add(newMenuItem(\"Exit\"));
//addmenutomenubarmb.add(m);setMenuBar(mb);//installthismenubar
intheframe
//Addbuttonstotheirownpanelp3.setLayout(newFlowLayout);
p3.add(d2Binary);p3.add(d2Octal);p3.add(d2Hex);p3.add(d2Base36);
//AddtextfieldsLabeldLabel=newLabel(\"EnterDeecimal:\");Label
xLabel=newLabel(\"ConvertedValue:\");dDisplay=new
TextField(integer.toString(decimalValue),7);xDisplay=new
TextField(baseXValue,32);xDisplay.setEditable(false);
p1.setLayout(newFlowLayout(FlowLayout.LEFT));p2.setLayout(new
FlowLayout(FlowLayout.LEFT));p1.add(dLabel);p1.add(dDisplay);
p2.add(xLabel);p2.add(xDisplay);
//Addthepanelsadd(\"North\",p1);add(\"Center\",p2);
add(\"South\",p3);}//endd2xconstructor
publicvoidstart{resize(400,150);show;}
publicvoidupdateXDisplay{xDisplay.setText(baseXValue);}
publicbooleanhandleEvent(Eventevt){if(evt.targtintanceofMenuItem)
{if(\"Exit\".equals(((MenuItem)evt.target).getLabel)){hide;
dispose;System.exit(0);returnfalse;}retruntrue;}elseif
(evt.targetinstanceofButton){Stringwhick=
((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;returntrue;}
returnfalse;}
publicstaticvoidmain(Stringargs){d2xm=newd2x;m.start;}}
本章小结:
1.java有两种类型的应用程序,一种是直接运行在java虚拟机上,用java命令执行;另一种运行在浏览器里,由浏览器调用执行,一般称它为Applet小程序。本书主要讨论第一种应用程序。2.java应用程序是由类组成的,而且用java命令行执行的类必须有main入口函数。3.与C语言相似,java程序也可由命令行传递给main函数参数。4.基本窗口java程序的基本类是Frame。利用它可以很方便地建立图形用户界面程序。