實驗十八 總複習
實驗十八 總複習
實驗時間 2018-12-30
1、實驗目的與要求
(1) 綜合掌握java基本程式結構;
(2) 綜合掌握java面向物件程式設計特點;
(3) 綜合掌握java GUI 程式設計結構;
(4) 綜合掌握java多執行緒程式設計模型;
(5) 綜合程式設計練習。
2、實驗內容和步驟
任務1:填寫課程課後調查問卷,網址:https://www.wjx.cn/jq/33108969.aspx。
任務2:綜合程式設計練習
練習1:設計一個使用者資訊採集程式,要求如下:
(1) 使用者資訊輸入介面如下圖所示:
(1)使用者點選提交按鈕時,使用者輸入資訊顯示控制檯介面;
(2)使用者點選重置按鈕後,清空使用者已輸入資訊;
(3)點選視窗關閉,程式退出。
package o; import java.awt.Dimension; import java.awt.FlowLayout; import java.awt.GridLayout; import javax.swing.BorderFactory; import javax.swing.ButtonGroup; import javax.swing.JButton;DemoJFrameimport javax.swing.JCheckBox; import javax.swing.JComboBox; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JRadioButton; import javax.swing.JTextField; public class DemoJFrame extends JFrame { private JPanel jPanel1; private JPanel jPanel2;private JPanel jPanel3; private JPanel jPanel4; private JTextField fieldname; private JComboBox comboBox; private JTextField fieldadress; private ButtonGroup bg; private JRadioButton Male; private JRadioButton Female; private JCheckBox read; private JCheckBox sing; private JCheckBox dance; public DemoJFrame() { // 設定視窗大小 this.setSize(800, 400); // 設定可見性 this.setVisible(true); // 設定標題 this.setTitle("程式設計練習一"); // 設定關閉操作 this.setDefaultCloseOperation(EXIT_ON_CLOSE); // 設定視窗居中 WinCenter.center(this); // 建立四個面板物件 jPanel1 = new JPanel(); setJPanel1(jPanel1); jPanel2 = new JPanel(); setJPanel2(jPanel2); jPanel3 = new JPanel(); setJPanel3(jPanel3); jPanel4 = new JPanel(); setJPanel4(jPanel4); // 設定容器的為流佈局 FlowLayout flowLayout = new FlowLayout(); this.setLayout(flowLayout); // 將四個面板新增到容器中 this.add(jPanel1); this.add(jPanel2); this.add(jPanel3); this.add(jPanel4); } /* * 設定面一 */ private void setJPanel1(JPanel jPanel) { // TODO 自動生成的方法存根 jPanel.setPreferredSize(new Dimension(700, 45)); // 給面板的佈局設定為網格佈局 一行4列 jPanel.setLayout(new GridLayout(1, 4)); JLabel name = new JLabel("name:"); name.setSize(100, 50); fieldname = new JTextField(""); fieldname.setSize(80, 20); JLabel study = new JLabel("qualification:"); comboBox = new JComboBox(); comboBox.addItem("初中"); comboBox.addItem("高中"); comboBox.addItem("本科"); jPanel.add(name); jPanel.add(fieldname); jPanel.add(study); jPanel.add(comboBox); } /* * 設定面板二 */ private void setJPanel2(JPanel jPanel) { // TODO 自動生成的方法存根 jPanel.setPreferredSize(new Dimension(700, 50)); // 給面板的佈局設定為網格佈局 一行4列 jPanel.setLayout(new GridLayout(1, 4)); JLabel name = new JLabel("address:"); fieldadress = new JTextField(); fieldadress.setPreferredSize(new Dimension(150, 50)); JLabel study = new JLabel("hobby:"); JPanel selectBox = new JPanel(); selectBox.setBorder(BorderFactory.createTitledBorder("")); selectBox.setLayout(new GridLayout(3, 1)); read = new JCheckBox("reading"); sing = new JCheckBox("singing"); dance = new JCheckBox("danceing"); selectBox.add(read); selectBox.add(sing); selectBox.add(dance); jPanel.add(name); jPanel.add(fieldadress); jPanel.add(study); jPanel.add(selectBox); } /* * 設定面板三 */ private void setJPanel3(JPanel jPanel) { // TODO 自動生成的方法存根 jPanel.setPreferredSize(new Dimension(700, 150)); FlowLayout flowLayout = new FlowLayout(FlowLayout.LEFT); jPanel.setLayout(flowLayout); JLabel sex = new JLabel("性別:"); JPanel selectBox = new JPanel(); selectBox.setBorder(BorderFactory.createTitledBorder("")); selectBox.setLayout(new GridLayout(2, 1)); bg = new ButtonGroup(); Male = new JRadioButton("male"); Female = new JRadioButton("female"); bg.add(Male ); bg.add(Female); selectBox.add(Male); selectBox.add(Female); jPanel.add(sex); jPanel.add(selectBox); } /* * 設定面板四 */ private void setJPanel4(JPanel jPanel) { // TODO 自動生成的方法存根 jPanel.setPreferredSize(new Dimension(700, 150)); FlowLayout flowLayout = new FlowLayout(FlowLayout.CENTER, 50, 10); jPanel.setLayout(flowLayout); jPanel.setLayout(flowLayout); JButton sublite = new JButton("提交"); JButton reset = new JButton("重置"); sublite.addActionListener((e) -> valiData()); reset.addActionListener((e) -> Reset()); jPanel.add(sublite); jPanel.add(reset); } /* * 提交資料 */ private void valiData() { // TODO 自動生成的方法存根 // 拿到資料 String name = fieldname.getText().toString().trim(); String xueli = comboBox.getSelectedItem().toString().trim(); String address = fieldadress.getText().toString().trim(); System.out.println(name); System.out.println(xueli); String hobbystring=""; if (read.isSelected()) { hobbystring+="reading "; } if (sing.isSelected()) { hobbystring+="singing "; } if (dance.isSelected()) { hobbystring+="dancing "; } System.out.println(address); if (Male.isSelected()) { System.out.println("male"); } if (Female.isSelected()) { System.out.println("female"); } System.out.println(hobbystring); } /* * 重置 */ private void Reset() { // TODO 自動生成的方法存根 fieldadress.setText(null); fieldname.setText(null); comboBox.setSelectedIndex(0); read.setSelected(false); sing.setSelected(false); dance.setSelected(false); bg.clearSelection(); } } DemoJFrame
package o; import java.awt.EventQueue; import javax.swing.JFrame; public class Main { public static void main(String[] args) { EventQueue.invokeLater(() -> { DemoJFrame page = new DemoJFrame(); }); } } MainMain
package o; import java.awt.Dimension; import java.awt.Toolkit; import java.awt.Window; public class WinCenter { public static void center(Window win){ Toolkit tkit = Toolkit.getDefaultToolkit(); Dimension sSize = tkit.getScreenSize(); Dimension wSize = win.getSize(); if(wSize.height > sSize.height){ wSize.height = sSize.height; } if(wSize.width > sSize.width){ wSize.width = sSize.width; } win.setLocation((sSize.width - wSize.width)/ 2, (sSize.height - wSize.height)/ 2); } } WinCenterWinCenter
練習2:採用GUI介面設計以下程式:
l 編制一個程式,將身份證號.txt 中的資訊讀入到記憶體中;
l 按姓名字典序輸出人員資訊;
l 查詢最大年齡的人員資訊;
l 查詢最小年齡人員資訊;
l 輸入你的年齡,查詢身份證號.txt中年齡與你最近人的姓名、身份證號、年齡、性別和出生地;
l 查詢人員中是否有你的同鄉。
l 輸入身份證資訊,查詢所提供身份證號的人員資訊,要求輸入一個身份證數字時,查詢介面就顯示滿足查詢條件的查詢結果,且隨著輸入的數字的增多,查詢匹配的範圍逐漸縮小。
練習3:採用GUI介面設計以下程式
l 編寫一個計算器類,可以完成加、減、乘、除的操作
l 利用計算機類,設計一個小學生100以內數的四則運算練習程式,由計算機隨機產生10道加減乘除練習題,學生輸入答案,由程式檢查答案是否正確,每道題正確計10分,錯誤不計分,10道題測試結束後給出測試總分;
l 將程式中測試練習題及學生答題結果輸出到檔案,檔名為test.txt。
package jisuan; import java.awt.Font; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.FileNotFoundException; import java.io.PrintWriter; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JTextArea; public class Jisuan extends JFrame { private String[] c=new String[10]; private String[] c1=new String[10]; private int[] list=new int[10]; int i=0,i1=0,sum = 0; private PrintWriter out = null; private JTextArea text,text1; private int counter; public Jisuan() { JPanel Panel = new JPanel();Panel.setLayout(null); JLabel JLabel1=new JLabel("");JLabel1.setBounds(500, 800, 400, 30);JLabel1.setFont(new Font("Courier",Font.PLAIN,35)); JButton Button = new JButton("生成題目");Button.setBounds(50,150,150,50);Button.setFont(new Font("Courier",Font.PLAIN,20)); Button.addActionListener(new Action()); JButton Button2 = new JButton("確定答案");Button2.setBounds(300,150,150,50);Button2.setFont(new Font("Courier",Font.PLAIN,20));Button2.addActionListener(new Action1()); JButton Button3 = new JButton("讀出檔案");Button3.setBounds(500,150,150,50);Button3.setFont(new Font("Courier",Font.PLAIN,20));Button3.addActionListener(new Action2()); text=new JTextArea(30,80);text.setBounds(30, 50, 200, 50);text.setFont(new Font("Courier",Font.PLAIN,35)); text1=new JTextArea(30,80);text1.setBounds(270, 50, 200, 50);text1.setFont(new Font("Courier",Font.PLAIN,35)); Panel.add(text); Panel.add(text1); Panel.add(Button); Panel.add(Button2); Panel.add(Button3); Panel.add(JLabel1); add(Panel); } private class Action implements ActionListener { public void actionPerformed(ActionEvent event) { text1.setText("0"); if(i<10) { int a = 1+(int)(Math.random() * 99); int b = 1+(int)(Math.random() * 99); int m= (int) Math.round(Math.random() * 3); switch(m) { case 0: while(a<b){ b = (int) Math.round(Math.random() * 100);a = (int) Math.round(Math.random() * 100); } c[i]=(i+":"+a+"/"+b+"="); list[i]=Math.floorDiv(a, b); text.setText(i+":"+a+"/"+b+"="); i++; break; case 1: c[i]=(i+":"+a+"*"+b+"="); list[i]=Math.multiplyExact(a, b); text.setText(i+":"+a+"*"+b+"="); i++; break; case 2: c[i]=(i+":"+a+"+"+b+"="); list[i]=Math.addExact(a, b); text.setText(i+":"+a+"+"+b+"="); i++; break ; case 3: while(a<=b){ b = (int) Math.round(Math.random() * 100);a = (int) Math.round(Math.random() * 100); } c[i]=(i+":"+a+"-"+b+"="); text.setText(i+":"+a+"-"+b+"="); list[i]=Math.subtractExact(a, b);i++; break ; } } } } private class Action1 implements ActionListener { public void actionPerformed(ActionEvent event) { if(i<10) { text.setText(null); String daan=text1.getText().toString().trim(); int a = Integer.parseInt(daan); if(text1.getText()!="") { if(list[i1]==a) sum+=10; } c1[i1]=daan; i1++; } } } private class Action2 implements ActionListener { public void actionPerformed(ActionEvent event) { try { out = new PrintWriter("text.txt"); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } for(int counter=0;counter<10;counter++) { out.println(c[counter]+c1[counter]); } out.println("成績"+sum); out.close(); } } } JisuanJisuan
package jisuan; import java.awt.Dimension; import java.awt.EventQueue; import java.awt.Toolkit; import javax.swing.JFrame; public class math { public static void main (String args[]) { Toolkit t=Toolkit.getDefaultToolkit(); Dimension s=t.getScreenSize(); EventQueue.invokeLater(() -> { JFrame frame = new Jisuan(); frame.setBounds(0, 0,(int)s.getWidth()/2,(int)s.getHeight()/2); frame.setTitle("produce by 楊野"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setVisible(true); }); } } mathmath
任務3:本學期課程已結束,請彙總《面向物件程式設計課程學習進度條》的資料,統計個人專業能力提升的資料。並從學習內容、學習方法、學習心得幾個方面進行課程學習總結,也希望你對課程的不足提出建議和意見。
總結:JAVA特點:簡單的、面向物件的、分散式的、強壯的、安全的、體系結構中立的、可移植的、解釋型的、高效能的、多執行緒的、動態的語言。
原始檔的命名規則:如果原始檔中有多個類,那麼只能有一個類是 public類。如果有一個類是public類,那麼原始檔的名字必須與這個類的名字完全相同,副檔名是.java。如果原始檔沒有public類,那麼原始檔的名字只要和某個類的名字相同,並且副檔名是.java就可以了。
Java流程控制語句:控制語句: if語句, switch語句.迴圈語句 :while , do…while ,for break和continue語句 :break——跳出switch結構;終止並跳出迴圈體。continue——結束本次迴圈。
類體內容由兩部分構成:類成員變數:用來刻畫類屬性;類成員方法:用來刻畫類內操作。
區域性變數:在方法體中定義的變數和方法的引數被稱為區域性變數。類成員變數和區域性變數的區別:類成員變數在整個類內都有效,區域性變數只在定義它的方法內有效。如果區域性變數的名字與成員變數的名字相同,則成員變數被隱藏。
類成員方法:方法的定義包括兩部分:方法宣告和方法體。構造方法:名字必須與類名完全相同,沒有返回值型別;構造方法可以過載;每個類至少有一個構造方法,若程式設計師沒有定義構造方法,系統會自動產生一個預設構造方法,這個預設構造方 法無引數,方法體為空;程式設計師為類定義了構造方法,系統就不再提供預設構造方法;用途:初始化類物件。
方法過載:一個類中可以有多個具有相同的名字的方法。但這些方法或者是引數的個數不同,或者是引數的型別不同。
建立物件需兩個步驟:物件宣告和為物件分配記憶體。
Static關鍵字:用static修飾的成員變數稱為類(靜態)變數,用static修飾的方法稱為類(靜態)方法。例項變數和類變數的區別:如果類的成員變數有類變數,那麼該類所有物件的類變數記憶體是相同的。具有訪問許可權的類變數可以通過某個物件訪問,也可以通過類名訪問。具有訪問許可權的例項變數僅可以通過物件訪問,不能使用類名訪問。例項方法和類方法的區別:例項方法可以被類建立的任何物件呼叫執行。類方法不僅可以被類建立的任何物件呼叫執行,也可以直接通過類名呼叫
this關鍵字:this表示類的當前物件。this可以出現在例項方法和構造方法中,但不可以出現在類方法中。this關鍵字出現在構造方法中時,代表使用該構造方法所建立的物件。this出現在類的例項方法中時,代表正在呼叫該方法 的當前物件。
實現類繼承的方式:在類的宣告中,通過使用關鍵字extends來建立一個類的子類。Java只支援單繼承,不允許多繼承 。Java允許有多層繼承。
方法重寫是指:子類中定義一個方法,這個方法的名字、返回型別、引數個數和型別與從父類繼承的方法完全相同。子類重寫父類,被重寫的方法不能比父類擁有更嚴格的訪問許可權
super關鍵字:子類中訪問父類中被隱藏的成員變數,super.成員變數,子類呼叫父類中的方法。呼叫父類中的特定構造方法 super() ,呼叫父類中被重寫的方法 super.方法()
多型性有兩種表現形式:①方法的多型性(方法過載)②物件的多型性。物件多型性是在繼承應用上的一種擴充套件
final關鍵字:final關鍵子可修飾類、方法成員、成員變數和方法中的引數。final類不能被繼承,即不能有子類。方法被修飾為final方法,則這個方法不能被重寫。一個成員變數被修飾為final的,就是常量,常量必須 賦給初值,而且不能再發生變化。方法的引數被修飾為final的,該引數的值不能被改變。
抽象類:用關鍵字abstract修飾的類稱為abstract類(抽象類)。 abstract類不能被例項化; abstract類可以有abstract方法;對於abstract方法,只允許宣告,不允許實現,且要用 abstract關鍵字進行修飾;抽象類的子類必須重寫所有的抽象方法。
介面的宣告與使用:關鍵字interface來定義一個介面。介面的定義與類的定義相似,包括介面的宣告和介面體。介面體中包含常量定義和抽象方法定義兩部分。介面使用規則:一個類可以實現多個介面;如果一個類使用了某個介面,那麼這個類必須實現該介面的所有方法,即為這些方法提供方法體。
方法的許可權訪問修飾符: public,protected ,default(不加訪問說明符時), private。方法的其它修飾符 static ,final ,abstract ,synchronized。
類和類之間關係:is a: 繼承,實現關係。has a: 組合,聚合,關聯關係。use a: 依賴關係
丟擲異常:throws語句是在方法的宣告中使用來丟擲異常,用來指定方法可能丟擲異常,但不想在當前方法中處理這個異常。throw語句是在方法體內使用丟擲異常類的物件,程式在執行到throw語句時立即終止,它後面的語句都不執行。要捕捉throw丟擲的異常,則必須使用try-catch語句。
Java中的每個事件類都有一個相應的監視器介面,介面中聲明瞭一個或多個抽象的事件處理 方法。如果一個類實現事件監視器介面,其物件就可以作為對應事件的監視器,具備監視和處理事件的能力。
多執行緒機制是Java語言的重要特徵之一,使用多執行緒技術可以使系統同時執行多個執行體,加快程式的響應時間,提高計算機資源的利用率。使用多執行緒技術可以提高整個應用系統的效能。
程式、程序與執行緒的區別:程式是一段靜態的程式碼,它是應用軟體執行的藍本。程序是程式的一次動態執行過程,它對應了從程式碼載入、執行至執行完畢的一個完整過程,這個過程也是程序本身從產生、發展至消亡的過程。執行緒是比程序更小的執行單位,一個程序在其執行過程中,可以產生多個執行緒,形成多條執行線索,每條線索,即每個執行緒也有它自身的產生、存在和消亡的過 程,也是一個動態的概念。
多執行緒和多工:多執行緒和多工是兩個既有聯絡又有區別的概念。多工是針對作業系統而言的,代表著作業系統可以同時執行的程式個數;多執行緒是針對一個程式而言的,代表著一個程式內部可以同時執行的執行緒個數,而每個執行緒可以完成不同的任務。
執行緒的狀態與生命週期:新建:當一個Thread類或其子類的物件被宣告並建立時,新生的執行緒物件處於新建狀態。此時它已經有了佔用記憶體空間和其他資源的資格。執行:執行緒建立之後就具備了執行的條件,一旦輪到它來享用CPU資源時,即JVM將CPU使用權切換給該執行緒時,此執行緒的就可以脫離建立它的主執行緒獨立開始自己的生命週期了(即run方法執行的過程)。阻塞:有3種原因的阻塞:等待阻塞:執行了wait() 方法;同步阻塞:獲取synchronized同步鎖失敗;其他阻塞:執行了sleep()、join()方法;終止:run方法結束。
建立執行緒的方式有兩種:通過建立Thread類的子類來實現;通過實現Runnable介面的類來實現。
Thread的子類建立執行緒的關鍵操作:設計Thread的子類,重寫父類的run方法,用Thread類或子類建立執行緒物件,使用start方法啟動執行緒,JVM將CPU使用權切換給執行緒時,自動執行 run方法。
通過Runnable介面實現多執行緒的關鍵操作:設計一個實現Runnable介面的類,重寫run方法;以該類的物件為引數建立Thread類的物件;呼叫Thread類物件的start方法啟動執行緒,將執行權轉交到run方法。
經過一學期Java課的學習,對Java這門語言有了進一步的認識,但學習Java之路還很漫長。老師的教學方式對我們學習Java有很大的幫助,也感謝助教在百忙之中抽時間為我們解疑。