为了方便您阅读最新章节,请记住“闪文书库”网址 www.shanwen.com,注册会员收藏您喜爱的书籍
====>>>公告:晚上6点-11点高峰期,可能出现图片打开缓慢,如果太长时间没有打开,请刷新
第三卷第一章
??????
5.13动态成员函数发送
当你用点操作符调用一个对象实例的成员函数时,对象实例所属的类在编译时要被检查,以确保调用的成员函数在该类中是存在的。在运行时,对象实例可以指向所声明类型的子类的实例。在这?copy;情况下,如果子类覆盖了要调用的成员函数,Java就用实例来决定调用哪一个成员函数。如下面的例子,两个类是子类和超类的关系,子类覆盖了超类的成员函数。
classA{voidcallme(){System.out.println(\"在A的callme成员函数里\");}}
classBextendsA{voidcallme(){System.out.println(\"在B的callme成员函数里\");}}
classDispatch{publicstaticvoidmain(Stringargs[]){Aa=newB();a.callme();}}
有趣的是,在成员函数main里,我们把变量a声明为类型A,然后把类B的一个实例存放到它上面。我们在a上调用成员函数callme,Java编译器确定在类A确实有成员函数callme,但是在运行时,由于a事实上是B的实例,所以调用B的callme,而不调用A的。下面是运行结果:C:\\>javaDispatch在B的callme成员函数里
5.14final
在缺省情况下,所有的成员函数和实例变量都可以被覆盖。如果你希望你的变量或成员函数不再被子类覆盖,可以把它们声明为final。这意味着将来的实例都依赖这个定义。例如:finalintFILE_NEW=1;finalintFILE_OPEN=2;finalintFILE_SAVE=3;fianlintFILE_SAVEAS=4;finalintFILE_QUIT=5;final变量用大写标识符是一个一般的约定。
5.15静态
如果你想要创建一个可以在实例的外部调用的成员函数,那么你只需声明它为静态的(static?copy;,它就会正常运行。静态成员函数只能直接调用其他静态成员函数,而不能以任何方式使用this或super。你也可以把变量声明为静态的。如果你想初始化一个静态变量,你可以用static声明一个恰好在类调用时执行一次的程序块。下面的例子是一个带有一个静态成员函数,几个静态变
量,和一个静态初始块的类。
classStatic{staticinta=3;staticintb;staticvoidmethod(intx){System.out.println(\"x=\"+x);System.out.println(\"a=\"+a);System.out.println(\"b=\"+b);}static{System.out.println(\"静态初始块\");b=a*4;}publicstaticvoidmain(Stringargs[]){method(42);}}这个类被调用,所有的静态变量都被初始化,a被赋为3,然后运行static块,这将打印出一段消息,并且把b赋为a*4,即12。然后解释器调用main成员函数,它调用了成员函数method,参数x为42。这三个println语句打印了两个静态变量a、b和局部变量x。下面是运行结果:C:\\>javaStatic静态初始块x=42a=3b=12一个静态成员函数可以通过它所属的类名来调用。象调用实例变量一样,你可以用点操作符通过类名来调用静态成员函数和静态变量。Java就是这样实现了全局函数和全局变量。下面的例子里,我们创建了带有一个静态成员函数和两个静态变量的类。第二个类可以通过名字直接来调用第一个类的静态成员函数和静态变量。
classstaticClass{staticinta=42;staticintb=99;staticvoid
callme(){System.out.println(\"a=\"+a);}}
classStaticByName{publicstaticvoidmain(Stringargs[])
{StaticClass.callme();System.out.println(\"b=\"+staticClass.b);}}
下面是运行结果:C:\\>javastaticByNamea=42b=99
5.16抽象
有时你需要定义一个给出抽象结构、但不给出每个成员函数的完整实现的类。如果某个成员函数没有完整实现,必须要由子类来覆盖,你可把它声明为抽象(abstract?copy;型。含有抽象型成员函数的类必须声明为抽象的。为了把一个类声明为抽象的,你只需在类定义的class关键词前放置关键词abstract。这?copy;类不能直接用new操作符生成实例,因为它们的完整实现还没有定义。你不能定义抽象的构造函数或抽象的静态成员函数。抽象类的子类或者实现了它的超类的所有抽象的成员函数,或者也被声明为抽象的。下面例子是一个带有抽象成员函数的类,其后是一个实现了该成员函数的类。
abstractclassA{abstractvoidcallme();voidmetoo(){system.out.println(\"在A的metoo成员函数里\");}}classBextendsA{voidcallme(){System.out.println(\"在B的callme成员函数里\");}}classAbstract{publicstaticvoidmain(Stringargs[]){Aa=newB();
a.callme();a.metoo();}}
下面是运行结果:C:\\>javaAbstract在B的callme成员函数里在A的metoo成员函数里
本章小结
1.类是Java语言面向对象编程的基本元素,它定义了一个对象的结构和功能。2.Java通过在类定义的大括号里声明变量来把数据封装在一个类里,这里的变量称为实例变量。3.成员函数,是类的功能接口,是类定义里的一个子程序,在类的定义里和实例变量处于同一级别。
第六章Java图形用户接口
对一个优秀的应用程序来说,良好的图形用户接口是必不可少的。缺少良好的图形用户接口,将会给用户理解和使用应用程序带来很多不便。很难想象用户为了学会使用一个应用程序,去记一大堆命令。Java提copy;了生成一个良好的图形用户接口所需要的一copy;基本元件:面板(Panelcopy;、按钮(Buttoncopy;、标copy;(Labelcopy;、画板(Canvasescopy;、滚动条(Scrollbarcopy;、列表框(Listcopy;、文本域(TextFieldcopy;、文本区(TextAreacopy;。
6.1面板
面板提copy;了建立应用程序的空间。你可以把图形元件(包括其他面板copy;放在一个面板上。Applet类提copy;了一个基本的面板。
6.1.1布局管理
Java提copy;了几种布局:顺序布局(FlowLayoutcopy;、边界布局(BorderLayoutcopy;和网格布局(GridLayout)
6.1.1.1顺序布局
顺序布局(FlowLayoutcopy;是最基本的一种布局,面板的缺省布局就是顺序布局。顺序布局指的是把图形元件一个接一个地reg;平地放在面板上。下面是一个顺序布局的例子:
importjava.awt.*;importjava.applet.Applet;
publicclassmyButtonsextendsApplet{Buttonbutton1,button2,button3;
publicvoidinit(){button1=newButton(\"确定\");button2=newButton(\"打开\");button3=newButton(\"关闭\");add(button1);add(button2);add(button3);}}
6.1.1.2边界布局
边界布局包括五个区:北区、南区、东区、西区和中区。这几个区在面板上的分布规律是\"上北下南,左西右东\"。下面是一个边界布局的例子:
importjava.awt.*;importjava.applet.Applet;
publicclassbuttonDirextendsApplet{ButtonbuttonN,buttonS,buttonW,buttonE,buttonC;
publicvoidinit(){setLayout(newBorderLayout());buttonN=newButton(\"reg;\");buttonS=newButton(\"火\");buttonE=newButton(\"木\");buttonW=newButton(\"金\");buttonC=newButton(\"土\");add(\"North\",buttonN);add(\"South\",buttonS);add(\"East\",buttonE);add(\"West\",buttonW);add(\"Center\",buttonC);}}
6.1.1.3网格布局
网格布局把面板分成一个个的网格,你可以给出网格的行数和列数。下面是一个网格布局的例子:
importjava.awt.*;importjava.applet.Applet;
publicclassbuttonGridextendsApplet{Buttonbutton1,button2,button3,button4,button5,button6,button7,button8;
publicvoidinit(){setLayout(newGridLayout(4,2));button1=newButton(\"乾\");button2=newButton(\"坤\");button3=newButton(\"艮\");
button4=newButton(\"震\");button5=newButton(\"坎\");button6=newButton(\"离\");button7=newButton(\"巽\");button8=newButton(\"兑\");
add(button1);add(button2);add(button3);add(button4);add(button5);add(button6);add(button7);add(button8);}}
6.2按钮
6.2.1按钮事件
用户点一下按钮,就会有一个按钮事件发生。你可以通过覆盖一个applet的action成员函数来捕捉按钮事件。publicbooleanaction(Evente,Objecto){if(e.targetinstanceofButton){system.out.println((string)o);}else{System.out.println(\"Non-buttonevent\");}returntrue;}
6.2.2按钮类型
Java提copy;了标准的按压式按钮,同时也提copy;了选择式按钮和标记式按钮。
6.2.2.1选择式按钮
选择式按钮提copy;了从几个选项中选一个选项的功能。下面是从几个市中选一个市的例子,市名放在选择式按钮中:
CityChooser=newChoice();
CityChooser.addItem(\"北copy;\");CityChooser.addItem(\"上海\");
CityChooser.addItem(\"天津\");
add(CityChooser);
6.2.2.2标记式按钮
标记式按钮的状态作为标记框事件的对象参数返回。下面是一个标记式按钮的例子:
CheckboxfillStyleButton;fillStyleButton=newCheckbox(\"Solid\");
publicbooleanaction(Evente,Objectarg){if(e.targetinstanceof
Checkbox){System.out.println(\"Checkbox:\"+arg);}returntrue;}
6.2.2.3按键式按钮
按键式按钮是一组按钮,用户可以选中其中一个,同时这一组中的其他按钮将被关闭。下面是一个按键式按钮的例子:publicclassCheckBoxextendsApplet{CheckboxGroupcbg;publicvoidinit(){cbg=newCheckboxGroup();add(newCheckbox(\"one\",cbg,true));add(newCheckbox(\"two\",cbg,false));add(newCheckbox(\"three\",cbg,false));}}
6.2.3自包含按钮
Java语言的面向对象特性使我们能够创建完全自包含的按钮。在自包含按钮里,你可以在copy;展按钮类里建立事件控制函数。下面是一个自包含按钮的例子:
importjava.awt.*;importjava.applet.Applet;
classokButtonextendsButton{
publicokButton(){setLabel(\"Ok\");}
publicbooleanaction(Evente,Objectarg)
{System.out.println(\"OKButton\");returntrue;}}
publicclassbuttontestextendsApplet{okButtonmyOkButton;
publicvoidinit(){myOkButton=newokButton();add(myOkButton);}}
6.3标copy;
标copy;是一种放到面板上的静止的正文。下面是一个标copy;的例子:importjava.awt.*;importjava.applet.Applet;publicclasslabelextendsApplet{publicvoidinit(){setLayout(newFlowLayout(FlowLayout.CENTER,10,10));Labellabel1=newLabel(\"你好!\");Labellabel2=newLabel(\"另一个标copy;\");add(label1);add(label2);}}
6.4列表框
列表框使用户易于操作大量的选项。创建列表框的方法和Choicebutton有copy;相似。列表框的所有条目都是可见的,如果选项很多,超出了列表框可见区的范围,则列表框的旁边将会有一个滚动条。首先,创建列表框:Listl=newList(4,false);这个成员函数创建了一个显示4行的列表框。第二个参数\"false\"表示这个列表框是单选的,如果是\"true\",则表示是多选的。下面增加列表框的选项:l.addItem(\"北copy;大学\");l.addItem(\"清华大学\");l.addItem(\"吉林大学\");l.addItem(\"复copy;大学\");l.addItem(\"南开大学\");l.addItem(\"天津大学\");l.addItem(\"南copy;大学\");add(l);
6.4.1在列表框中进行选择
可以用成员函数getSelectedItem()或getSelectedItems()来接收在列表框中被选的选项。在单选列表框里,\"双击\"一个选项就可以触发一个可被action()成员函数捕捉到的事件。publicbooleanaction(Evente,Objectarg){if(e.targetinstanceofList){System.out.println(\"Listentry:\"+arg);}}
6.4.2多选列表框
对于多选列表框,要使你的选择产生作用,需要使用其他的外部事件。例如,你可以使用按钮事件:publicbooleanaction(Evente,Objectarg){if(e.targetinstanceofButton){if(\"Ok\".equals(arg)){string[]selected;selected=l.getSelectedItems();for(intI=0;I0){for(inti=0;i
为了方便下次访问,请牢记闪文书库网址www.shanwen.com,您的支持是我们最大的动力。注册会员