《Java语言入门》

下载本书

添加书签

Java语言入门- 第5部分


按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
ame时才调用它。
  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。利用它可以很方便地建立图形用户界面程序。
第五章Java的类
类是Java语言面向对象编程的基本元素,它定义了一个对象的结构和行为。在Java程序里,你要表达的概念封装在某个类里。一个类定义了一个对象的结构和它的功能接口,功能接口称为成员函数。当Java程序运行时,系统用类的定义创建类的实例,类的实例是真正的对象。类定义的一般形式如下:
classclassnameextendssuperclassname{typeinstance…variable1;typeinstance…variable2;。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。typeinstance…variableN;typemethodname1(parameter…list){method…body;}typemethodname2(parameter…list){method…body;}。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。typemethodnameN(parameter…list){method…body;}}
这里,classname和superclassname是合法的标识符。关键词extends用来表明classname是superclassname派生的子类。有一个类叫做Object,它是所有Java类的根。如果你想定义Object的直接子类,你可以省略extends子句,编译器会自动包含它。下面是一个简单的类的定义。classUniversity{}
5。1对象实例
类名可以作为变量的类型来使用,如果一个变量的类型是某个类,那么它将指向这个类的实例,称为对象实例。所有对象实例和它们的类型(某个类?copy;的子类的实例都是相容的。就象可以把byte型的值赋给int型的变量一样,你可以把Object的子类的任何实例赋给一个Object型的变量。一个实例是类模板的单独的拷贝,带有自己的称为实例变量的数据集。每个实例也可以作为一个对象。当你定义一个变量的类型是某个类时,它的缺省值是null,null是Object的一个实例。对象null没有值,它和整数0不同。下面这个例子中,声明变量u的类型是类University。Universityu;这里,变量u的值是null。
5。2实例变量
Java通过在类定义的大括号里声明变量来把数据封装在一个类里。这里的变量称为实例变量。下面的例子定义了一个叫做University的类,它有两个实例变量:name和city。classUniversity{Stringname;city;}
5。3new操作符
操作符new用来生成一个类的实例,下面这个例子生成了类University的一个实例,存放在变量u中。
Universityu=newUniversity();在此例中,变量u指向这个对象,但并不真正包含这个对象。你可以用多个变量指向同一个对象。下面的例子中,创建了一个University的对象,但创建了两个指向它的变量。
Universityu=newUniversity();Universityu2=u;
对u2所指向的对象的任何改动都会对u所指向的对象起作用,因为它们是同一个对象。对u和u2的赋值只是把它们指向这个对象,既没有分配内存,也没有复制这个对象的任何部分。对u的再赋值只是简单地去掉了u和原来对象的联系,并不影响对象本身,下面的例子说明了这种情况。
Universityu=newUniversity();Universityu2=u;u=null;
尽管u被赋值为null,u2仍指向原来由操作符new创建的对象。在前面的例子里,我们生成了一个对象并且指向了它两次。这就允许两个变量改变同一个对象。创建一个新的对象时,可直接对它的实例变量赋值。每个对象都有它所属类的实例变量的拷贝,每个对象的实例变量都是和其他对象的实例变量分离的,所以改变一个对象的实例变量不会影响其他对象的实例变量。下面的例子创建了两个University的对象,并对它们分别赋值:classTwoUniversity{publicstaticvoidmain(Stringargs''){Universityu1=newUniversity();Universityu2=newUniversity();u1。name=”北?copy;大学”;u1。city=”北?copy;”;u2。name=”清华大学”;u2。city=”北?copy;”;System。out。println(”大学:”+u1。name+”城市:”+u1。city);System。out。println(”大学:”+u2。name+”城市:”+u2。city);}}这个例子创建了两个University的对象,并且对它们的name、city分别赋了不同的值,这说明这两个对象是真正分离的。下面是该程序运行后的输出结果。C:》javaTwoUniversity大学:北?copy;大学城市:北?copy;大学:清华大学城市:北?copy;
5。4点(。?copy;操作符点(。?copy;操作符用来接收一个对象的实例变量和成员函数。下面是用点操作符来接收实例变量的一般形式。objectreference。variablename
这里objectreference是一个对象实例,variablename是这个对象里你想接收的实例变量。下面的程序段说明了怎样用点操作符来给实例变量赋值。
u。name=”北?copy;大学”;u。city=”北?copy;”;下面说明怎样用点操作符来得到实例变量的值。System。out。println(”大学:”+u。name+”城市:”+u。city);通过向类University里加入一个成员函数main,我们创建了一个完整的例子,它使用了new操作符来创建一个University,用点操作符来赋值,然后打印结果。classUniversity{Stringname;city;publicstaticvoidmain(Stringargs''){Universityu=newUniversity();u。name=”北?copy;大学”;u。city=”北?copy;”;System。out。println(”大学:”+u。name+”城市:”+u。city);}}
运行这个程序后,就会得到下面的结果。C:》javaUniversity大学:北?copy;大学城市:北?copy;
5。5成员函数定义
成员函数,是类的功能接口,是类定义里的一个子程序,在类的定义里和实例变量处于同一级别。你必须通过一个类的实例来调用成员函数。成员函数可以不用点操作符而直接使用实例变量。成员函数带有输入参数,具有
某种类型的返回值。成员函数定义的一般形式如下:typemethodname(formal…parameter…list){method…body;}这里type指的是成员函数的返回值的类型,如果没有返回值,就用无值(void?copy;类型。methodname可以是任何合法的标识符,但不能与当前的类名相同。formal…parameter…list是用逗号分隔的类型、标识符对的序列。如果没有参数,括号里就是空的。还是用我们的University的例子,下面的成员函数用来初始化两个实例变量。成员函数是在类的大括号?reg;内定义的,和实例变量所处的范围相同。classUniversity{Stringname;city;voidinit(Stringa;Stringb){name=a;city=b;}}
注意,我们这里直接给name和city赋值,而没有象以前那样用u1。name。这是因为每个成员函数都在类的个别实例内执行。我们创建的类的实例具有它自己的实例变量,所以成员函数可直接使用它们。
5。6成员函数调用
可以用点(。?copy;操作符来调用一个类的实例的成员函数。成员函数调用的一般形式如下:objectreference。methodname(parameter…list);这里,objectreference是指向某个对象的变量,methodname是objectreference所属类的一个成员函数,parameter…list是用逗号分隔的变量或表达式的序列,它们要与该成员函数的定义的参数个数及类型匹配。在这个例子里,我们可以对任何University对象调用成员函数init来给name和city赋值。下面的程序段说明了怎样完成这个工作。Universityu=newUniversity();u。init(”北?copy;大学”;”北?copy;”);这个例子创建了University的一个实例,存放在u中。通过点操作符来调用这个实例的init成员函数

小提示:按 回车 [Enter] 键 返回书目,按 ← 键 返回上一页, 按 → 键 进入下一页。 赞一下 添加书签加入书架