• 77.86 KB
  • 2022-04-22 11:52:01 发布

《Java2实用教程》课后习题参考答案.docx

  • 67页
  • 当前文档由用户上传发布,收益归属用户
  1. 1、本文档共5页,可阅读全部内容。
  2. 2、本文档内容版权归属内容提供方,所产生的收益全部归内容提供方所有。如果您对本文有版权争议,可选择认领,认领后既往收益都归您。
  3. 3、本文档由用户上传,本站不保证质量和数量令人满意,可能有诸多瑕疵,付费之前,请仔细先通过免费阅读内容等途径辨别内容交易风险。如存在严重挂羊头卖狗肉之情形,可联系本站下载客服投诉处理。
  4. 文档侵权举报电话:19940600175。
'Java2实用教程(第三版)课后习题参考答案第1章Java入门1.开发与运行Java程序需要经过哪些主要步骤和过程?答:(1)编写Java源文件:使用文本编辑器(Edit或记事本),拓展名为.java(2)编译Java源文件:使用Java编译器(javac.exe)。得到字节码文件*.class(3)运行Java程序:Java应用程序使用Java解释器(java.exe)执行字节码文件;Java小应用程序使用支持Java标准的浏览器来执行。2.怎样区分应用程序和小应用程序?应用程序的主类或小应用程序的主类必须用public修饰吗?答:①应用程序必须有main方法,这个方法是程序执行的入口。小应用程序没有main方法。②应用程序的主类不一定用public修饰;小应用程序的主类必须用public修饰。3.Java程序是由什么组成的?一个程序中必须要有public类吗?Java源文件的命名规则是怎样的?答:①Java程序由类组成。②应用程序可以没有public类;小应用程序一定有一个类是public类(主类)。③应用程序:如果只有一个类,源文件名与该类的类名相同,拓展名为.java;有多个类时,如果有public类(最多一个),源文件名与public类的类名相同,拓展名是.java;没有public类,源文件名与任何一个类的类名相同即可,拓展名为.java。小应用程序:源文件名与主类的类名相同,拓展名是.java。4.在运行小程序的HTML文件中可以使用codebase属性指定小程序的字节码所驻留的目录。如果不使用codebase属性,小程序的字节码文件必须和运行它的HTML文件在同一目录中。编写一个小程序并将小程序的字节码存放在某个目录中,比如C:5000;把运行该小程序的HTML文件(注意其中的codebase属性):存放在另一个目录中。答:以书中小应用程序为例进行说明:①编写Java小应用程序源代码importjava.applet.*;importjava.awt.*;publicclassBoyextendsApplet{ publicvoidpaint(Graphicsg){g.setColor(Color.red);g.drawString("我一边喝着咖啡,一边学Java呢",5,30);g.setColor(Color.blue);g.drawString("我学得很认真",10,50);}}②将上述代码命名为Boy.java并进行编译得到Boy.class字节码文件;将得到的字节码文件存放在www.3che.com三车资料库——学习资源共享专家C:5000文件夹下;③编写小应用程序的HTML源文件:④将上述编写好的代码命名为Boy.html;并将此文件存放在C:5000文件夹以外的任意一个文件夹中(如C:1000);⑤运行Boy.html。第2章标识符、关键字和数据类型1.什么叫标识符?标识符的规则是什么?答:①用来标识类名、变量名、、方法名、类型名、数组名、文件名的有效字符序列。②由字母、下划线、美元符号和数字组成,并且第一个字符不能是数字字符,而且关键字不能作为标识符。2.什么叫关键字?请说出5个关键字。答:①Java语言中已经被赋予特定意义的一些单词。②classbreakpublicreturnstaticextends等。3.Java的基本数据类型都是什么?答:boolean(逻辑型)char(字符型)float、double(浮点型)byte、short、int、long(整型)。4.下列哪些语句是错误的:intx=8;byteb=127;b=x;答:b=x语句错误;原因是高级别的变量赋值给低级别的变量时,一定要用显式转换即b=(byte)x;。5.下列程序的输出结果是什么?publicclassE{publicstaticvoidmain(Stringargs[]){long[]a={1,2,3,4}; long[]b={100,200,300,400,500};b=a;System.out.println("数组b的长度:"+b.length);System.out.println("b[0]="+b[0]);}}答:数组b的长度:4b[0]=16.上机运行下列程序,注意观察输出结果。publicclassE{publicstaticvoidmain(Stringargs[]){for(inti=20302;i<20322;i++){System.out.println((char)i);www.3che.com三车资料库——学习资源共享专家}}}答:低住佐佑佒体佔何佖佗佘余佚佛作佝佞佟你佡7.System.out.println(“你好”);可输出字符串,也可以使用System.out.println()输出变量或表达式的值,只需使用并置符号“+”将变量、表达式或一个常数值与一个字符串并置即可,如:System.out.println(“”+x);System.out.println(“:”+123+“大于”+122);等。上机调试下列程序,注意观察结果,特别注意System.out.print()和System.out.println()的区别。publicclassOutputData{publicstaticvoidmain(Stringargs[]){intx=234,y=432;System.out.println(x+"<"+(2*x));System.out.print("我输出结果后不回车");System.out.println("我输出结果后自动回车到下一行");System.out.println("x+y="+(x+y));System.out.println(""+x+y+"=234432");}} 答:234<468我输出结果后不回车我输出结果后自动回车到下一行x+y=666234432=2344328.编写一个Java应用程序,输出全部的希腊字母。答:publicclassXLWords{publicstaticvoidmain(Stringargs[]){for(inti=913;i<930;i++){System.out.print((char)i+"");}for(intj=931;j<938;j++){System.out.print((char)j+"");}for(intk=945;k<962;k++){System.out.print((char)k+"");}for(intt=963;t<=969;t++){www.3che.com三车资料库——学习资源共享专家System.out.print((char)t+"");}}}第3章运算符、表达式和语句1.下列程序的输出结果是什么?publicclassE{publicstaticvoidmain(Stringargs[]){charx="你",y="e",z="吃";if(x>"A") {y="爱";z="情";}elsey="我";z="她";System.out.println(""+x+y+z);}}答:你爱她2.下列程序的输出结果是什么?publicclassE3{publicstaticvoidmain(Stringargs[]){charc="";for(inti=1;i<=4;i++){switch(i){case1:c="b";System.out.print(c);case2:c="e";System.out.print(c);break;case3:c="p";System.out.print(c);default:System.out.print("!");}}}}答:beep!!3.编写应用程序,求1!+2!+…+10!。答:classFact {publicstaticvoidmain(Stringargs[]){intfact,sum=0;for(inti=1;i<=10;i++){fact=1;for(intj=1;j<=i;j++)fact*=j;sum+=fact;}System.out.println("1到10的阶乘之和是:"+sum);}}4.编写一个应用程序,求100以内的全部素数。答:classPrimes{publicstaticvoidmain(Stringargs[]){intw=1;for(inti=2;i<=100;i++){for(intj=2;j1000){MyExceptionexception=newMyException(m);throwexception;} elseSystem.out.println(m);}}publicclassTest{publicstaticvoidmain(Stringagrs[]){intm;Studentstu1=newStudent();m=987;try{stu1.speak(m);m=1234;stu1.speak(m);}catch(MyExceptione){e.showStr1();}}}18.编写一个类,该类有一个方法publicintf(inta,intb),该方法返回a和b的最大公约数。然后再编写一个该类的子类,要求子类重写方法f,而且重写的方法将返回a和b的最小公倍数。要求在重写的方法的方法体中首先调用被隐藏的方法返回a和b的最大公约数m,然后将乘积(a*b)/m返回。要求在应用程序的主类中分别使用父类和子类创建对象,并分别调用方法f计算两个正整数的最大公约数和最小公倍数。答:classA{publicintf(inta,intb){if(a0){Stringstr1=text1.getText()+"n"+text2.getText()+"n"+text3.getText()+"n";Stringstr2=textarea.getText();textarea.setText(str2+str1); }else{text2.setText("输入了非法格式的E-mail地址");}}}}publicclassTest{publicstaticvoidmain(Stringargs[]){newWindowBox();}}8.写一个应用程序,要求编写一个Panel的子类MyPanel,MyPanel中有一个文本框和一个按钮,要求MyPanel的实例作为其按钮的ActionEvent事件的监视器,当单击按钮时,程序获取文本框中的文本,并将该文本作为按钮的名称。然后在编写一个Frame的子类,即窗口。窗口的布局为BorderLayout布局。窗口中添加两个MyPanel面板,分别添加到窗口的东部区域和西部区域。答:importjava.awt.*;importjava.awt.event.*;classMyPanelextendsPanelimplementsActionListener{Stringname;TextFieldtext;Buttonbutton;MyPanel(){text=newTextField(10);button=newButton("确定");add(text);add(button);button.addActionListener(this);addWindowListener(newWindowAdapter(){publicvoidwindowClosing(WindowEvente){System.exit(0); }});}publicvoidactionPerformed(ActionEvente){if(e.getSource()==button){name=text.getText();button.setLabel(name);}}}classMyFrameextendsFrame{MyPanelpanel1,panel2;MyFrame(){panel1=newMyPanel();panel2=newMyPanel();add(panel1,BorderLayout.EAST);add(panel2,BorderLayout.WEST);setBounds(100,100,400,100);setVisible(true);validate();}}publicclassTest{publicstaticvoidmain(Stringargs[]){MyFramewin=newMyFrame();}}9.参照例子7.18编写一个应用程序,要求有一个画布,在画布上绘制一个矩形,用户通过文本框输入矩形的宽和高以及矩形左上角的位置坐标。答:importjava.awt.*; importjava.awt.event.*;classMycanvasextendsCanvas{intx,y,w,h;Mycanvas(){setBackground(Color.cyan);}publicvoidsetX(intx){this.x=x;}publicvoidsetY(inty){this.y=y;}publicvoidsetW(intw){this.w=w;}publicvoidsetH(inth){this.h=h;}publicvoidpaint(Graphicsg){g.drawRect(x,y,w,h);}}classWindowCanvasextendsFrameimplementsActionListener{Mycanvascanvas;TextFieldtext1,text2,text3,text4;Buttonbutton;WindowCanvas(){canvas=newMycanvas();text1=newTextField(4); text2=newTextField(4);text3=newTextField(5);text4=newTextField(5);PanelpNorth=newPanel(),pSouth=newPanel();button=newButton("确定");button.addActionListener(this);pNorth.add(newLabel("矩形的宽:"));pNorth.add(text3);pNorth.add(newLabel("矩形的高:"));pNorth.add(text4);pSouth.add(newLabel("左上角位置坐标:"));pSouth.add(text1);pSouth.add(text2);pSouth.add(button);addWindowListener(newWindowAdapter(){publicvoidwindowClosing(WindowEvente){System.exit(0);}});add(canvas,BorderLayout.CENTER);add(pNorth,BorderLayout.NORTH);add(pSouth,BorderLayout.SOUTH);setBounds(100,100,500,500);setVisible(true);validate();}publicvoidactionPerformed(ActionEvente){intx,y,w,h;try{x=Integer.parseInt(text1.getText());y=Integer.parseInt(text2.getText());w=Integer.parseInt(text3.getText());h=Integer.parseInt(text4.getText()); canvas.setX(x);canvas.setY(y);canvas.setW(w);canvas.setH(h);canvas.repaint();}catch(NumberFormatExceptionee){x=0;y=0;w=0;h=0;}}}publicclassTest{publicstaticvoidmain(Stringargs[]){newWindowCanvas();}}10.编写应用程序,有一个窗口对象,该窗口取它的默认布局:BorderLayout布局,北面添加一个List组件,该组件有四个商品名称的选项。中心添加一个文本区,当选择List组件中的某个选项后,文本区显示对该商品的价格和产地:当双击List组件中的某个选项后,文本区显示该商品的详细广告。答:importjava.awt.*;importjava.awt.event.*;classWindowGoodsextendsFrameimplementsActionListener,ItemListener{Strings[]={"产地:北京","产地:上海","产地:沈阳","产地:广东"};Stringp[]={"价格:3200","价格:158","价格:13.2","价格:320/打"};Stringa[]={"本商品****","本商品*****","本商品******","本商品*******"};Listlist;TextAreatext;WindowGoods(){list=newList(3,false);text=newTextArea(6,20);text.setEditable(false);list.add("商品1"); list.add("商品2");list.add("商品3");list.add("商品4");add(list,BorderLayout.NORTH);add(text,BorderLayout.CENTER);list.addItemListener(this);list.addActionListener(this);addWindowListener(newWindowAdapter(){publicvoidwindowClosing(WindowEvente){System.exit(0);}});setBounds(100,100,300,300);setVisible(true);validate();}publicvoiditemStateChanged(ItemEvente){if(e.getItemSelectable()==list){intm=list.getSelectedIndex();text.setText(p[m]+"n"+s[m]);}}publicvoidactionPerformed(ActionEvente){intn=list.getSelectedIndex();text.setText(a[n]);}}publicclassTest{publicstaticvoidmain(Stringargs[]){newWindowGoods(); }}11.编写程序,观察各种组件设置背景色和前景色的情况。答:importjava.awt.*;importjava.awt.event.*;classWindowColorextendsFrameimplementsActionListener{Buttonbutton;//按钮TextFieldtextfield;//文本框TextAreatextarea;//文本区Mypanelpanel;//面板Checkboxbox;//选择框Choicechoice;//下拉列表Listlist;//滚动列表Labellabel;//标签Mycanvascan;//画布ButtonbuttonBackColor,buttonForeColor;WindowColor(){button=newButton("我是按钮");textfield=newTextField("我是文本框",10);textarea=newTextArea(6,15);textarea.setText("我是文本区");textfield.setEditable(false);textarea.setEditable(false);panel=newMypanel();box=newCheckbox("我是选择框");choice=newChoice();choice.add("我是下拉列表");list=newList(3,false);list.add("我是滚动列表");label=newLabel("我是标签");can=newMycanvas();buttonBackColor=newButton("背景色");buttonForeColor=newButton("前景色");setLayout(newFlowLayout());add(button);add(textfield); add(textarea);add(panel);add(box);add(choice);add(list);add(label);add(can);add(buttonBackColor);add(buttonForeColor);addWindowListener(newWindowAdapter(){publicvoidwindowClosing(WindowEvente){System.exit(0);}});buttonBackColor.addActionListener(this);buttonForeColor.addActionListener(this);setBounds(100,100,300,300);setVisible(true);validate();}publicvoidactionPerformed(ActionEvente){if(e.getSource()==buttonBackColor){button.setBackground(Color.yellow);textfield.setBackground(Color.yellow);textarea.setBackground(Color.yellow);panel.setBackground(Color.yellow);box.setBackground(Color.yellow);choice.setBackground(Color.yellow);list.setBackground(Color.yellow);label.setBackground(Color.yellow);can.setBackground(Color.yellow);}elseif(e.getSource()==buttonForeColor) {button.setForeground(Color.blue);textfield.setForeground(Color.blue);textarea.setForeground(Color.blue);panel.setForeground(Color.blue);box.setForeground(Color.blue);choice.setForeground(Color.blue);list.setForeground(Color.blue);label.setForeground(Color.blue);can.setForeground(Color.blue);}}}classMycanvasextendsCanvas{Mycanvas(){}publicvoidpaint(Graphicsg){g.drawString("我是画布",5,5);}}classMypanelextendsPanel{Buttonbutton1;Mypanel(){button1=newButton("我是面板");add(button1);}}publicclassTest{publicstaticvoidmain(Stringargs[]){newWindowColor();}}12.编写应用程序,有一个标题为“移动”的窗口,窗口的布局为null,在窗口中有两个按钮,单击一个按钮让另一个按钮移动。 答:importjava.awt.*;importjava.awt.event.*;classWindowMoveextendsFrameimplementsActionListener{Buttonbutton1,button2;WindowMove(Strings){super(s);setLayout(null);button1=newButton("我让它横向走动");button2=newButton("我让它纵向走动");button1.setBackground(Color.blue);button2.setBackground(Color.green);button1.addActionListener(this);button2.addActionListener(this);button1.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));button2.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));add(button1);add(button2);addWindowListener(newWindowAdapter(){publicvoidwindowClosing(WindowEvente){System.exit(0);}});button1.setBounds(20,80,100,30);button2.setBounds(100,180,100,30);setBounds(100,100,500,500);setVisible(true);validate();}publicvoidactionPerformed(ActionEvente){Rectanglerect1=button1.getBounds();intx1=(int)rect1.getX();inty1=(int)rect1.getY(); Rectanglerect2=button2.getBounds();intx2=(int)rect2.getX();inty2=(int)rect2.getY();if(e.getSource()==button1){x2=x2+5;button2.setLocation(x2,y2);}elseif(e.getSource()==button2){y1=y1+5;button1.setLocation(x1,y1);}}}publicclassTest{publicstaticvoidmain(Stringargs[]){newWindowMove("移动");}}13.编写应用程序,有一个标题为“改变颜色”的窗口,窗口的布局为null,在窗口中有3个按钮和一个画布,3个按钮的颜色分别是红、绿、蓝。单击相应的按钮,画布绘制相应颜色的圆。答:importjava.awt.*;importjava.awt.event.*;classWindowChangeColorextendsFrameimplementsActionListener{ButtonbuttonRed,buttonGreen,buttonBlue;Mycanvascanvas;WindowChangeColor(Strings){super(s);setLayout(null);buttonRed=newButton("红色");buttonGreen=newButton("绿色");buttonBlue=newButton("蓝色");canvas=newMycanvas(); buttonRed.setBackground(Color.red);buttonGreen.setBackground(Color.green);buttonBlue.setBackground(Color.blue);add(canvas);canvas.setBounds(10,10,150,150);add(buttonRed);buttonRed.setBounds(10,170,50,30);add(buttonGreen);buttonGreen.setBounds(70,170,50,30);add(buttonBlue);buttonBlue.setBounds(130,170,50,30);buttonRed.addActionListener(this);buttonGreen.addActionListener(this);buttonBlue.addActionListener(this);addWindowListener(newWindowAdapter(){publicvoidwindowClosing(WindowEvente){System.exit(0);}});setBounds(100,100,200,250);setVisible(true);validate();}publicvoidactionPerformed(ActionEvente){if(e.getSource()==buttonRed){canvas.setX(1);canvas.repaint();}elseif(e.getSource()==buttonGreen){canvas.setX(2);canvas.repaint();} elseif(e.getSource()==buttonBlue){canvas.setX(3);canvas.repaint();}}}classMycanvasextendsCanvas{intx=0;Mycanvas(){setBackground(Color.white);}publicvoidsetX(inty){x=y;}publicvoidpaint(Graphicsg){switch(x){case1:g.setColor(Color.red);break;case2:g.setColor(Color.green);break;case3:g.setColor(Color.blue);break;default:g.setColor(Color.white);}g.drawOval(65,65,50,50);}}publicclassTest{ publicstaticvoidmain(Stringargs[]){newWindowChangeColor("改变颜色");}}14.编写应用程序,测试Cursor类中表示鼠标形状的静态常量。答:importjava.awt.*;importjava.awt.event.*;classWindowCursorextendsFrameimplementsActionListener{Buttonbutton,button1;TextFieldtext;intn=-1;WindowCursor(){button=newButton("单击我");text=newTextField("将鼠标放在上面的按钮上看形状");button1=newButton("看看你鼠标的形状");add(button,BorderLayout.NORTH);add(button1,BorderLayout.CENTER);add(text,BorderLayout.SOUTH);button.setBackground(Color.cyan);button1.setBackground(Color.pink);button.addActionListener(this);addWindowListener(newWindowAdapter(){publicvoidwindowClosing(WindowEvente){System.exit(0);}});setBounds(100,100,190,150);setVisible(true);validate();}publicvoidactionPerformed(ActionEvente){ n=(n+1)%10;switch(n){case0:button1.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));break;case1:button1.setCursor(Cursor.getPredefinedCursor(Cursor.CROSSHAIR_CURSOR));break;case2:button1.setCursor(Cursor.getPredefinedCursor(Cursor.TEXT_CURSOR));break;case3:button1.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));break;case4:button1.setCursor(Cursor.getPredefinedCursor(Cursor.N_RESIZE_CURSOR));break;case5:button1.setCursor(Cursor.getPredefinedCursor(Cursor.NW_RESIZE_CURSOR));break;case6:button1.setCursor(Cursor.getPredefinedCursor(Cursor.NE_RESIZE_CURSOR));break;case7:button1.setCursor(Cursor.getPredefinedCursor(Cursor.W_RESIZE_CURSOR));break;case8:button1.setCursor(Cursor.getPredefinedCursor(Cursor.MOVE_CURSOR));break;case9:button1.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));break;}}}publicclassTest{ publicstaticvoidmain(Stringargs[]){newWindowCursor();}}15.改进本章例子7.30,当释放鼠标键时,如果当前组件和其他组件相交,就将其他组件设置为不可见状态。答:importjava.awt.*;importjava.awt.event.*;importjavax.swing.SwingUtilities;classWinextendsFrameimplementsMouseListener,MouseMotionListener{Buttonbutton;TextFieldtext;intx,y;booleanmove=false;Win(){button=newButton("用鼠标拖动我");text=newTextField("用鼠标拖动我",8);text.setBackground(Color.green);button.setBackground(Color.blue);button.addMouseListener(this);button.addMouseMotionListener(this);text.addMouseListener(this);text.addMouseMotionListener(this);addMouseMotionListener(this);setLayout(newFlowLayout());add(button);add(text);addWindowListener(newWindowAdapter(){publicvoidwindowClosing(WindowEvente){System.exit(0);}}); setBounds(10,10,350,300);setVisible(true);validate();}publicvoidmousePressed(MouseEvente){}publicvoidmouseReleased(MouseEvente){move=false;Rectanglerect=button.getBounds();intx=(int)rect.getX();inty=(int)rect.getY();if(rect.intersects(text.getBounds())){if(e.getSource()==button){text.setVisible(false);}elseif(e.getSource()==text){button.setVisible(false);}}}publicvoidmouseEntered(MouseEvente){}publicvoidmouseExited(MouseEvente){}publicvoidmouseClicked(MouseEvente){}publicvoidmouseMoved(MouseEvente){}publicvoidmouseDragged(MouseEvente){Componentcom=null;if(e.getSource()instanceofComponent){com=(Component)e.getSource();if(com!=this)move=true;e=SwingUtilities.convertMouseEvent(com,e,this);if(move){ x=e.getX();y=e.getY();intw=com.getSize().width,h=com.getSize().height;com.setLocation(x-w/2,y-h/2);}}}}publicclassTest{publicstaticvoidmain(Stringargs[]){Winwin=newWin();}}16.进一步改进本章例子7.33,要求一个按钮在移动时,不允许和其他按钮相交。答:importjava.awt.*;importjava.awt.event.*;classWinextendsFrameimplementsKeyListener{Buttonb[]=newButton[8];intx,y;Win(){setLayout(newFlowLayout());for(inti=0;i<8;i++){b[i]=newButton(""+i);b[i].addKeyListener(this);add(b[i]);}addWindowListener(newWindowAdapter(){publicvoidwindowClosing(WindowEvente){System.exit(0);} });setBounds(10,10,300,300);setVisible(true);validate();}publicvoidkeyPressed(KeyEvente){booleanmove=false;Buttonbutton=(Button)e.getSource();Rectanglebuttonrect=button.getBounds();Stringstr=button.getLabel();intxx=Integer.parseInt(str);x=button.getBounds().x;y=button.getBounds().y;if(e.getKeyCode()==KeyEvent.VK_UP){y=y-2;if(y<=0)y=0;}elseif(e.getKeyCode()==KeyEvent.VK_DOWN){y=y+2;if(y>=300)y=300;}elseif(e.getKeyCode()==KeyEvent.VK_LEFT){x=x-2;if(x<=0)x=0;}elseif(e.getKeyCode()==KeyEvent.VK_RIGHT){x=x+2;if(x>=300)x=300;}buttonrect.setLocation(x,y);for(intk=0;k<8;k++){ Rectanglerect=b[k].getBounds();if((buttonrect.intersects(rect))&&(xx!=k)){move=true;}}if(move==false){button.setLocation(x,y);}}publicvoidkeyTyped(KeyEvente){}publicvoidkeyReleased(KeyEvente){}}publicclassTest{publicstaticvoidmain(Stringargs[]){Winwin=newWin();}}第8章建立对话框1.编写一个应用程序,用户可以在一个文本框里输入数字字符,按Enter键后将数字放入一个文本区。当输入的数字大于1000时,弹出一个有模式的对话框,提示用户数字已经大于1000,是否继续将该数字放入文本区。答:importjava.awt.event.*;importjava.awt.*;importjavax.swing.JOptionPane;classWindowSaveNumberextendsFrameimplementsActionListener{TextFieldtextInputNumber;TextAreatextSaveNumber;WindowSaveNumber(){textInputNumber=newTextField(15);textSaveNumber=newTextArea();add(textInputNumber,BorderLayout.NORTH); add(textSaveNumber,BorderLayout.CENTER);textInputNumber.addActionListener(this);setBounds(100,100,400,300);setVisible(true);validate();addWindowListener(newWindowAdapter(){publicvoidwindowClosing(WindowEvente){System.exit(0);}});}publicvoidactionPerformed(ActionEvente){Strings=textInputNumber.getText();intnum=Integer.parseInt(s);if(num<=1000){textSaveNumber.append("n"+s);textInputNumber.setText(null);}else{intn=JOptionPane.showConfirmDialog(this,"数字已经大于1000是否继续将该数字放入文本区","确认对话框",JOptionPane.YES_NO_OPTION);if(n==JOptionPane.YES_OPTION){textSaveNumber.append("n"+s);}elseif(n==JOptionPane.NO_OPTION){textInputNumber.setText(null);}}}} publicclassTest{publicstaticvoidmain(Stringargs[]){newWindowSaveNumber();}}2.参考Windows平台的NotePad,编写一个简单的“记事本”程序。答:importjava.awt.*;importjava.awt.event.*;importjavax.swing.JOptionPane;classNotepadextendsFrameimplementsActionListener{MenuBarmenubar;Menumenu1,menu2,menu3,menu5;MenuItemitem[]=newMenuItem[23];TextAreatext;FileDialogfiledialog_save;FileDialogfiledialog_load;Notepad(Strings){super(s);menubar=newMenuBar();menu1=newMenu("文件");menu2=newMenu("编辑");menu3=newMenu("格式");menu5=newMenu("帮助");item[0]=newMenuItem("新建");item[0].setShortcut(newMenuShortcut(KeyEvent.VK_N));item[1]=newMenuItem("打开");item[1].setShortcut(newMenuShortcut(KeyEvent.VK_O));item[3]=newMenuItem("保存");item[3].setShortcut(newMenuShortcut(KeyEvent.VK_S));item[4]=newMenuItem("页面设置");item[5]=newMenuItem("打印");item[5].setShortcut(newMenuShortcut(KeyEvent.VK_P));item[6]=newMenuItem("退出");item[7]=newMenuItem("撤销"); item[7].setShortcut(newMenuShortcut(KeyEvent.VK_Z));item[8]=newMenuItem("剪切");item[8].setShortcut(newMenuShortcut(KeyEvent.VK_X));item[9]=newMenuItem("复制");item[9].setShortcut(newMenuShortcut(KeyEvent.VK_C));item[10]=newMenuItem("粘贴");item[10].setShortcut(newMenuShortcut(KeyEvent.VK_V));item[11]=newMenuItem("删除");item[12]=newMenuItem("查找");item[13]=newMenuItem("查找下一个");item[14]=newMenuItem("替换");item[15]=newMenuItem("转到");item[16]=newMenuItem("全选");item[17]=newMenuItem("时间/日期");item[18]=newCheckboxMenuItem("自动换行");item[21]=newMenuItem("帮助主题");item[22]=newMenuItem("关于记事本");text=newTextArea();filedialog_save=newFileDialog(this,"保存文件",FileDialog.SAVE);filedialog_load=newFileDialog(this,"打开文件",FileDialog.LOAD);filedialog_save.setVisible(false);filedialog_load.setVisible(false);filedialog_save.addWindowListener(newWindowAdapter(){publicvoidwindowClosing(WindowEvente){filedialog_save.setVisible(false);}});filedialog_load.addWindowListener(newWindowAdapter(){publicvoidwindowClosing(WindowEvente){filedialog_load.setVisible(false);}}); menu1.add(item[0]);menu1.add(item[1]);menu1.add(item[3]);menu1.addSeparator();menu1.add(item[4]);menu1.add(item[5]);menu1.addSeparator();menu1.add(item[6]);menu2.add(item[7]);menu2.addSeparator();menu2.add(item[8]);menu2.add(item[9]);menu2.add(item[10]);menu2.add(item[11]);menu2.addSeparator();menu2.add(item[12]);menu2.add(item[13]);menu2.add(item[14]);menu2.add(item[15]);menu2.addSeparator();menu2.add(item[16]);menu2.add(item[17]);menu3.add(item[18]);menu5.add(item[21]);menu5.addSeparator();menu5.add(item[22]);menubar.add(menu1);menubar.add(menu2);menubar.add(menu3);menubar.add(menu5);item[0].addActionListener(this);item[1].addActionListener(this);item[3].addActionListener(this);item[6].addActionListener(this);item[21].addActionListener(this);item[22].addActionListener(this);setMenuBar(menubar);add(text,BorderLayout.CENTER); setBounds(100,100,600,400);addWindowListener(newWindowAdapter(){publicvoidwindowClosing(WindowEvente){System.exit(0);}});setVisible(true);validate();}publicvoidactionPerformed(ActionEvente){if(e.getSource()==item[0])//完成新建{text.setText(null);}elseif(e.getSource()==item[1])//完成打开{filedialog_load.setVisible(true);}elseif(e.getSource()==item[3])//完成保存{filedialog_save.setVisible(true);}elseif(e.getSource()==item[6])//完成退出{System.exit(0);}elseif(e.getSource()==item[21]){JOptionPane.showMessageDialog(this,"此版本中有很多功能没有实现n剩余功能正在开发中n请等待下一版本","帮助主题",JOptionPane.INFORMATION_MESSAGE);}elseif(e.getSource()==item[22]){JOptionPane.showMessageDialog(this,"名称:自己做的NotePadn作者:王财n版本:NotePad1.1n运行平台:Windows平台","关于记事本 ",JOptionPane.INFORMATION_MESSAGE);}}}publicclassTest{publicstaticvoidmain(String[]args){newNotepad("自己做的NotePad");}}注:本题意义在于用本章学的内容添加一些对话框;此程序中有两种对话框的掉用;此程序只有大体模型,功能方面大部分都没有去实现。等学了第10章输入输出流以后,可以把本题当做课程设计去做。我这有做完的完整程序,有能力的想要的可以联系我。第9章Java多线程机制1.线程有几种状态?答:一个线程在它的一个完整的生命周期有4种状态,分别是:新建、运行、中断和死亡,即(运行、就绪、挂起、结束)。2.引起线程中断的常见原因是什么?答:①JVM将CPU资源从当前线程切换给其他线程,使本线程让出CPU的使用权处于中断状态;②线程使用CPU资源期间,执行了sleep(intmillsecond)方法,使当前线程进入休眠状态;③线程使用CPU资源期间,执行了wait()方法,使得当前线程进入等待状态;④线程使用CPU资源期间,执行某个操作进入阻塞状态,比如执行读/写操作引起阻塞。3.一个线程执行完run()方法后,进入了什么状态?该线程还能再调用start()方法吗?答:执行完run()方法后,进入了死亡状态;此时不能再调用start()方法。4.线程在什么状态时,调用isAlive()方法返回的值是false。答:线程处于“新建”状态时,线程调用调用isAlive()方法返回的值是false。当线程处于“死亡”状态时,其返回值也是false.5.建立线程有几种方法?答:①用Thread类直接创建一个线程;创建时要向构造方法Thread(Runnabletarget)传递一个Runnable接口的实例。②用Thread类的子类创建一个线程;需要重写父类的run()方法。6.怎样设置线程的优先级?答:线程的优先级通过setPriority(intgrade)方法设置,需要传递一个在0-10的int型参数。7.在多线程中,为什么要引入同步机制?答:引入同步机制解决了当两个或两个以上线程同时访问同一个变量,并且一个线程需要修改这个变量时发生的混乱。8.在什么地方wait()方法、notify()及notifyAll()方法可以被调用? 答:①通常在线程的同步方法中使用到它们。②不涉及同步的时候也可以调用,wait()方法挂起一个线程,notifyAll()方法使得挂起的线程恢复。9.将例子9.14中的循环条件:while(五元钱的个数<3)改写成:if(五元钱的个数<3)是否合理。答:合理;因为在这道题中,while并不代表循环,而是表示条件,所以可以用if代换。10.线程调用interrupt()的作用是什么?答:interrupt()方法用来“吵醒”休眠的线程。即:它所完成的是当线程处于阻塞状态时,抛出InterruptedException异常,使其从阻塞状态退出来。注:interrupt()方法不会中断一个正在运行的线程。11.参照例子9.11编写一个应用程序,有两个线程,一个负责模仿垂直上抛运动,另一个模仿45°的抛体运动。答:importjava.awt.*;importjava.awt.event.*;publicclassTest{publicstaticvoidmain(Stringargs[]){MyFrameframe=newMyFrame();frame.setBounds(10,10,500,500);frame.setVisible(true);frame.addWindowListener(newWindowAdapter(){publicvoidwindowClosing(WindowEvente){System.exit(0);}});}}classMyFrameextendsFrameimplementsRunnable{Thread红色球,蓝色球;MyCanvasred,blue;doublet=0;MyFrame() {红色球=newThread(this);蓝色球=newThread(this);red=newMyCanvas(Color.red);blue=newMyCanvas(Color.blue);setLayout(null);add(red);add(blue);red.setLocation(60,100);blue.setLocation(60,100);红色球.start();蓝色球.start();}publicvoidrun(){while(true){t=t+0.2;intv0=20;if(t>20)t=0;if(Thread.currentThread()==红色球){intx=60;inth=300-((int)(v0*t-1.0/2*t*t*3.8)+60);red.setLocation(x,h);try{红色球.sleep(50);}catch(InterruptedExceptione){}}elseif(Thread.currentThread()==蓝色球){intx=60+(int)(26*t);inth=300-((int)(v0*t-1.0/2*t*t*3.8)+60);blue.setLocation(x,h);try{蓝色球.sleep(50); }catch(InterruptedExceptione){}}}}}classMyCanvasextendsCanvas{Colorc;MyCanvas(Colorc){setSize(20,20);this.c=c;}publicvoidpaint(Graphicsg){g.setColor(c);g.fillOval(0,0,20,20);}}12.参照例子9.14,模拟3个人排队买票,张某、李某和赵某买电影票,售票员只有3张五元的钱,电影票五元一张。张某拿二十元一张的人民币排在李某的前面买票,李某排在赵某的前面拿一张十元的人民币买票,赵某拿一张五元的人民币买票。答:importjava.awt.*;importjava.awt.event.*;publicclassTest{publicstaticvoidmain(Stringargs[]){newMyFrame();}}classMyFrameextendsFrameimplementsRunnable,ActionListener{售票员王小姐;Thread张某,李某,赵某;staticTextAreatext; Buttonstart=newButton("排队买票");MyFrame(){王小姐=new售票员();//只有3张五元钱电影票五元一张张某=newThread(this);//二十元排在最前面李某=newThread(this);//十元排在中间赵某=newThread(this);//五元排在最后text=newTextArea(10,30);start.addActionListener(this);add(text,BorderLayout.CENTER);add(start,BorderLayout.NORTH);setVisible(true);setSize(360,300);validate();addWindowListener(newWindowAdapter(){publicvoidwindowClosing(WindowEvente){System.exit(0);}});}publicvoidactionPerformed(ActionEvente){try{张某.start();李某.start();赵某.start();}catch(Exceptionexp){}}publicvoidrun(){if(Thread.currentThread()==张某){王小姐.售票规则(20);}elseif(Thread.currentThread()==李某) {王小姐.售票规则(10);}elseif(Thread.currentThread()==赵某){王小姐.售票规则(5);}}}class售票员{int五元钱个数=3,十元钱个数=0,二十元钱个数=0;Strings=null;publicsynchronizedvoid售票规则(intmoney){if(money==5){五元钱个数=五元钱个数+1;s="给您入场卷您的钱正好";MyFrame.text.append("n"+s);}elseif(money==10){while(五元钱个数<1){try{wait();}catch(InterruptedExceptione){}}五元钱个数=五元钱个数-1;十元钱个数=十元钱个数+1;s="给您入场卷"+"您给我10元,找您5元";MyFrame.text.append("n"+s);}elseif(money==20){while((五元钱个数<4)&&(五元钱个数<1||十元钱个数<1)) {try{wait();}catch(InterruptedExceptione){}}if(五元钱个数>=4){五元钱个数=五元钱个数-3;二十元钱个数=二十元钱个数+1;s="给您入场卷"+"您给我20元,找您15元";MyFrame.text.append("n"+s);}elseif(五元钱个数>=1&&十元钱个数>=1){五元钱个数=五元钱个数-1;十元钱个数=十元钱个数-1;二十元钱个数=二十元钱个数+1;s="给您入场卷"+"您给我20元,找您15元";MyFrame.text.append("n"+s);}}notifyAll();}}13.参照例子9.9,要求有3个线程:student1、student2和teacher,其中student1准备睡10分钟后再开始上课,其中student2准备睡一小时后再开始上课。teacher在输出3句“上课”后,吵醒休眠的线程student1;student1被吵醒后,负责再吵醒休眠的线程student2。答:classInterruptSleepimplementsRunnable{Threadstudent1,student2,teacher;InterruptSleep(){teacher=newThread(this);student1=newThread(this);student2=newThread(this);} publicvoidrun(){if(Thread.currentThread()==student2){try{System.out.println("student2要睡一小时再听课,现在不听课");Thread.sleep(1000*60*60);}catch(InterruptedExceptione){System.out.println("student2还没睡够呢,但是被student1给叫醒了");}System.out.println("student2开始上课");}elseif(Thread.currentThread()==student1){try{System.out.println("student1要睡10分钟再上课,现在不听课");Thread.sleep(1000*60*10);}catch(InterruptedExceptione){System.out.println("student1还没睡够呢,但是被teacher给叫醒了");}System.out.println("student1开始上课");student2.interrupt();}elseif(Thread.currentThread()==teacher){for(inti=1;i<=3;i++){System.out.println("teacher:上课!");try{Thread.sleep(500);}catch(InterruptedExceptione){}}student1.interrupt(); }}}publicclassTest{publicstaticvoidmain(String[]args){InterruptSleepa=newInterruptSleep();a.student2.start();a.student1.start();a.teacher.start();}}14.参照例子9.19,编写一个Java应用程序,在主线程中再创建3个线程:“运货司机”、“装运工”和“仓库管理员”。要求线程“运货司机”占有CPU资源后立刻联合线程“装运工”,也就是让“运货司机”一直等到“装运工”完成工作才能开车,而“装运工”占有CPU资源后立刻联合线程“仓库管理员”,也就是让“装运工”一直等到“仓库管理员”打开仓库才能开始搬运货物。答:publicclassTest{publicstaticvoidmain(Stringargs[]){ThreadJoina=newThreadJoin();a.运货司机.start();a.装运工.start();a.仓库管理员.start();}}classThreadJoinimplementsRunnable{Goodsgoods;Thread运货司机,装运工,仓库管理员;ThreadJoin(){运货司机=newThread(this);装运工=newThread(this);仓库管理员=newThread(this);运货司机.setName("运货司机");装运工.setName("装运工");仓库管理员.setName("仓库管理员"); }publicvoidrun(){if(Thread.currentThread()==运货司机){System.out.println(运货司机.getName()+"等"+装运工.getName()+"装运货物");try{装运工.join();}catch(InterruptedExceptione){}System.out.println(运货司机.getName()+"开始运输"+goods.name);}elseif(Thread.currentThread()==装运工){System.out.println(装运工.getName()+"等"+仓库管理员.getName()+"打开仓库");try{仓库管理员.join();}catch(InterruptedExceptione){}System.out.println(装运工.getName()+"开始搬运"+goods.name);}elseif(Thread.currentThread()==仓库管理员){System.out.println(仓库管理员.getName()+"准备打开仓库,请等待......");try{仓库管理员.sleep(2000);}catch(InterruptedExceptione){}goods=newGoods("一批货物");System.out.println(仓库管理员.getName()+"已经打开仓库,可以搬运了");}}}classGoods{Stringname;Goods(Stringname){ this.name=name;}}15.在下列程序的主线程main方法中,又开始运行了几个线程?importjava.awt.*;importjava.awt.event.*;classGxyextendsThreadimplementsRunnable{Framef=newFrame("OK");TextFieldtext1=newTextField(20),text2=newTextField(20),text3=newTextField(20);doublen=0,正面=0,反面=0,正立=0;Gxy(){f.setLayout(newFlowLayout());f.setSize(200,300);f.setVisible(true);f.add(text1);f.add(text2);f.add(text3);f.validate();f.addWindowListener(newWindowAdapter(){publicvoidwindowClosing(WindowEvente){System.exit(0);}});}publicvoidrun(){while(true){n++;doublei=Math.random();if(i<0.5){正面++;text1.setText("正面出现的频率:"+正面/n); }elseif(i==0.5){正立++;text2.setText("正立出现的频率:"+正立/n);}else{反面++;text3.setText("反面出现的频率:"+反面/n);}try{Thread.sleep(200);}catch(Exceptione){}}}}publicclassE{publicstaticvoidmain(Stringargs[]){Threadt=newThread(newGxy());t.start();}}'