1、實驗目的與要求java
(1) 綜合掌握java基本程序結構;程序員
(2) 綜合掌握java面向對象程序設計特色;編程
(3) 綜合掌握java GUI 程序設計結構;安全
(4) 綜合掌握java多線程編程模型;多線程
(5) 綜合編程練習。dom
2、實驗內容和步驟分佈式
任務1:填寫課程課後調查問卷,網址:https://www.wjx.cn/jq/33108969.aspx。ide
任務2:綜合編程練習性能
練習1:設計一個用戶信息採集程序,要求以下:學習
(1) 用戶信息輸入界面以下圖所示:
(1)用戶點擊提交按鈕時,用戶輸入信息顯示控制檯界面;
(2)用戶點擊重置按鈕後,清空用戶已輸入信息;
(3)點擊窗口關閉,程序退出。
import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.*; import javax.swing.*; public class DemoJFrame { public static void main(String[] args) { EventQueue.invokeLater(() -> { JFrame frame = new FrameTest(); frame.setTitle("Students Detail"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setVisible(true); }); } } class FrameTest extends JFrame { private JPanel panel; private JTextField fieldname; private JTextField fieldadress; private JRadioButton male, female; private ButtonGroup bg; private JLabel jPanel; private JCheckBox reading, singsing, dancing; private JComboBox<String> JComboBox; private JButton validate, reset; public FrameTest() { setSize(700, 500); panel = new JPanel(); panel.setLayout(null); bg = new ButtonGroup(); male = new JRadioButton("Male", false); male.setBounds(150, 330, 80, 50); female = new JRadioButton("Female", false); female.setBounds(150, 300, 80, 50); bg.add(male); bg.add(female); addJLabel("sex:", 100, 300); addJLabel("name:", 100, 50); addJLabel("address:", 100, 150); addJLabel("Qualification:", 400, 50); addJLabel("Hobby:", 400, 150); fieldname = new JTextField(); fieldname.setBounds(150, 70, 120, 30); fieldname.setVisible(true); fieldadress = new JTextField(); fieldadress.setBounds(150, 160, 130, 100); fieldadress.setVisible(true); reading = new JCheckBox("Reading"); reading.setBounds(450, 160, 100, 30); singsing = new JCheckBox("dancing"); singsing.setBounds(450, 180, 100, 30); dancing = new JCheckBox("singing"); dancing.setBounds(450, 200, 100, 30); JComboBox = new JComboBox<>(); JComboBox.addItem("初中"); JComboBox.addItem("高中"); JComboBox.addItem("大學"); JComboBox.setBounds(500, 65, 100, 20); validate = new JButton("提交"); validate.setBounds(200, 400, 100, 35); reset = new JButton("重置"); reset.setBounds(400, 400, 100, 35); validate.addActionListener(new Action1()); reset.addActionListener(new Action2()); panel.add(reading); panel.add(singsing); panel.add(dancing); panel.add(validate); panel.add(reset); panel.add(JComboBox); panel.add(fieldname); panel.add(fieldadress); panel.add(male); panel.add(female); add(panel); } public void addJLabel(String n, int a, int b) { jPanel = new JLabel(n); jPanel.setBounds(a, b, 100, 50); panel.add(jPanel); } private class Action1 implements ActionListener { public void actionPerformed(ActionEvent event) { System.out.println("name:" + fieldname.getText() + "\n" + "address:" + fieldadress.getText()); System.out.println("Qualification:" + JComboBox.getSelectedItem()); System.out.println("Hobby:"); if (reading.isSelected() == true) System.out.print(reading.getText()); if (singsing.isSelected() == true) System.out.print(singsing.getText()); if (dancing.isSelected() == true) System.out.print(dancing.getText()); System.out.println("\n" + "sex:"); if (male.isSelected() == true) System.out.println(male.getText()); if (female.isSelected() == true) System.out.println(female.getText()); } } private class Action2 implements ActionListener { public void actionPerformed(ActionEvent event) { fieldname.setText(null); fieldadress.setText(null); reading.setSelected(false); singsing.setSelected(false); dancing.setSelected(false); bg.clearSelection(); JComboBox.setSelectedIndex(0); } } }
練習2:採用GUI界面設計如下程序:
l 編制一個程序,將身份證號.txt 中的信息讀入到內存中;
l 按姓名字典序輸出人員信息;
l 查詢最大年齡的人員信息;
l 查詢最小年齡人員信息;
l 輸入你的年齡,查詢身份證號.txt中年齡與你最近人的姓名、身份證號、年齡、性別和出生地;
l 查詢人員中是否有你的同鄉。
l 輸入身份證信息,查詢所提供身份證號的人員信息,要求輸入一個身份證數字時,查詢界面就顯示知足查詢條件的查詢結果,且隨着輸入的數字的增多,查詢匹配的範圍逐漸縮小。
package ID; import java.awt.*; import javax.swing.*; /** * @version 1.34 2015-06-12 * @author Cay Horstmann */ public class button { public static void main(String[] args) { EventQueue.invokeLater(() -> { JFrame frame = new Main(); frame.setTitle("身份證"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setVisible(true); }); } }
package ID; public class Person implements Comparable<Person> { private String name; private String ID; private int age; private String sex; private String birthplace; public String getname() { return name; } public void setname(String name) { this.name = name; } public String getID() { return ID; } public void setID(String ID) { this.ID = ID; } public int getage() { return age; } public void setage(int age) { this.age = age; } public String getsex() { return sex; } public void setsex(String sex) { this.sex = sex; } public String getbirthplace() { return birthplace; } public void setbirthplace(String birthplace) { this.birthplace = birthplace; } public int compareTo(Person o) { return this.name.compareTo(o.getname()); } public String toString() { return name + "\t" + sex + "\t" + age + "\t" + ID + "\t" + birthplace + "\n"; } }
package ID; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.InputStreamReader; import java.io.FileNotFoundException; import java.io.IOException; import java.util.*; import java.awt.*; import javax.swing.*; import java.awt.event.*; public class Main extends JFrame { private static ArrayList<Person> personlist; private static ArrayList<Person> list; private JPanel panel; private JPanel buttonPanel; private static final int DEFAULT_WIDTH = 600; private static final int DEFAULT_HEIGHT = 300; public Main() { personlist = new ArrayList<>(); Scanner scanner = new Scanner(System.in); File file = new File("身份證號.txt"); try { FileInputStream fis = new FileInputStream(file); BufferedReader in = new BufferedReader(new InputStreamReader(fis)); String temp = null; while ((temp = in.readLine()) != null) { Scanner linescanner = new Scanner(temp); linescanner.useDelimiter(" "); String name = linescanner.next(); String ID = linescanner.next(); String sex = linescanner.next(); String age = linescanner.next(); String place = linescanner.nextLine(); Person Person = new Person(); Person.setname(name); Person.setID(ID); Person.setsex(sex); int a = Integer.parseInt(age); Person.setage(a); Person.setbirthplace(place); personlist.add(Person); } } catch (FileNotFoundException e) { System.out.println("查找不到信息"); e.printStackTrace(); } catch (IOException e) { System.out.println("信息讀取有誤"); e.printStackTrace(); } JPanel panel = new JPanel(); panel.setLayout(new BorderLayout()); JTextArea jt = new JTextArea(); panel.add(jt); add(panel, BorderLayout.CENTER); JPanel buttonPanel = new JPanel(); buttonPanel.setLayout(new GridLayout(1, 7)); JButton jButton = new JButton("字典排序"); JButton jButton1 = new JButton("年齡最大和年齡最小"); JLabel lab = new JLabel("你的老鄉"); JTextField jt1 = new JTextField(); JLabel lab1 = new JLabel("查找年齡相近的:"); JTextField jt2 = new JTextField(); JLabel lab2 = new JLabel("輸入你的身份證號碼:"); JTextField jt3 = new JTextField(); JButton jButton2 = new JButton("退出"); jButton.setBounds(110, 90, 40, 50); jButton1.setBounds(110, 90, 40, 50); jt1.setBounds(110, 90, 40, 50); jt2.setBounds(110, 90, 40, 50); jt3.setBounds(110, 90, 40, 50); jButton2.setBounds(110, 90, 40, 50); jButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { Collections.sort(personlist); jt.setText(personlist.toString()); } }); jButton1.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { int max = 0, min = 100; int j, k1 = 0, k2 = 0; for (int i = 1; i < personlist.size(); i++) { j = personlist.get(i).getage(); if (j > max) { max = j; k1 = i; } if (j < min) { min = j; k2 = i; } } jt.setText("年齡最大:" + personlist.get(k1) + "年齡最小:" + personlist.get(k2)); } }); jButton2.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { dispose(); System.exit(0); } }); jt1.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { String find = jt1.getText(); String text = ""; String place = find.substring(0, 3); for (int i = 0; i < personlist.size(); i++) { if (personlist.get(i).getbirthplace().substring(1, 4).equals(place)) { text += "\n" + personlist.get(i); jt.setText("老鄉:" + text); } } } }); jt2.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { String yourage = jt2.getText(); int a = Integer.parseInt(yourage); int near = agenear(a); int value = a - personlist.get(near).getage(); jt.setText("年齡相近:" + personlist.get(near)); } }); jt3.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { list = new ArrayList<>(); Collections.sort(personlist); String key = jt3.getText(); for (int i = 1; i < personlist.size(); i++) { if (personlist.get(i).getID().contains(key)) { list.add(personlist.get(i)); jt.setText("你多是:\n" + list); } } } }); buttonPanel.add(jButton); buttonPanel.add(jButton1); buttonPanel.add(lab); buttonPanel.add(jt1); buttonPanel.add(lab1); buttonPanel.add(jt2); buttonPanel.add(lab2); buttonPanel.add(jt3); buttonPanel.add(jButton2); add(buttonPanel, BorderLayout.SOUTH); setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT); } public static int agenear(int age) { int min = 53, value = 0, k = 0; for (int i = 0; i < personlist.size(); i++) { value = personlist.get(i).getage() - age; if (value < 0) value = -value; if (value < min) { min = value; k = i; } } return k; } }
練習3:採用GUI界面設計如下程序
l 編寫一個計算器類,能夠完成加、減、乘、除的操做
l 利用計算機類,設計一個小學生100之內數的四則運算練習程序,由計算機隨機產生10道加減乘除練習題,學生輸入答案,由程序檢查答案是否正確,每道題正確計10分,錯誤不計分,10道題測試結束後給出測試總分;
l 將程序中測試練習題及學生答題結果輸出到文件,文件名爲test.txt。
package math; 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 main(); frame.setBounds(0, 0, (int) s.getWidth() / 2, (int) s.getHeight() / 2); frame.setTitle("算術測試"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setVisible(true); }); } }
package math; import java.awt.Font; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.FileNotFoundException; import java.io.PrintWriter; import java.util.Collections; import java.util.Scanner; import javax.swing.*; import java.math.*; public class main 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 main() { JPanel Panel = new JPanel(); Panel.setLayout(null); JLabel JLabel1 = new JLabel(""); JLabel1.setBounds(500, 800, 400, 30); JLabel1.setFont(new Font("Courier", Font.PLAIN, 20)); 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, 30)); text1 = new JTextArea(30, 80); text1.setBounds(270, 50, 200, 50); text1.setFont(new Font("Courier", Font.PLAIN, 30)); 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(""); if (i <= 10) { int a = (int) Math.round(Math.random() * 100); int b = (int) Math.round(Math.random() * 100); int m = (int) Math.round(Math.random() * 3); switch (m) { case 0: while (a % b != 0) { a = (int) Math.round(Math.random() * 100); } while (b == 0) { b = (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 z = text1.getText().toString().trim(); int a = Integer.parseInt(z); if (text1.getText() != "") { if (list[i1] == a) sum += 10; } c1[i1] = z; 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(); } } }
任務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有很大的幫助,也感謝助教在百忙之中抽時間爲咱們解疑。