实验十八 总复习
实验时间 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:设计一个用户信息采集程序,要求如下:
package project1; import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.border.*; public class test extends JFrame {
public test() {
JPanel panel1 = new JPanel();
panel1.setPreferredSize(new Dimension(700, 45));
panel1.setLayout(new GridLayout(1, 4));
JLabel label1 = new JLabel("Name:");
JTextField j1 = new JTextField("");
JLabel label2 = new JLabel("Qualification:");
JComboBox<Object> j2 = new JComboBox<>();
j2.addItem("Graduate");
j2.addItem("Not Graduate");
panel1.add(label1);
panel1.add(j1);
panel1.add(label2);
panel1.add(j2); JPanel panel2 = new JPanel();
panel2.setPreferredSize(new Dimension(700, 50));
panel2.setLayout(new GridLayout(1, 4));
JLabel label3 = new JLabel("Address:");
JTextArea j3 = new JTextArea();
JLabel label4 = new JLabel("Hobby:");
JPanel p = new JPanel();
p.setLayout(new GridLayout(3, 1));
p.setBorder(BorderFactory.createLineBorder(null));
JCheckBox c1 = new JCheckBox("Reading");
JCheckBox c2 = new JCheckBox("Singing");
JCheckBox c3 = new JCheckBox("Dancing");
p.add(c1);
p.add(c2);
p.add(c3);
panel2.add(label3);
panel2.add(j3);
panel2.add(label4);
panel2.add(p); JPanel panel3 = new JPanel();
panel3.setPreferredSize(new Dimension(700, 150));
FlowLayout flowLayout1 = new FlowLayout(FlowLayout.CENTER, 50, 10);
panel3.setLayout(flowLayout1);
JLabel label5 = new JLabel("Sex:");
JPanel p1 = new JPanel();
p1.setLayout(new GridLayout(2, 1));
p1.setBorder(BorderFactory.createLineBorder(null));
ButtonGroup bu = new ButtonGroup();
JRadioButton jr1 = new JRadioButton("Male");
JRadioButton jr2 = new JRadioButton("Female");
bu.add(jr1);
bu.add(jr2);
p1.add(jr1);
p1.add(jr2);
panel3.add(label5);
panel3.add(p1);
add(panel1);
add(panel2);
add(panel3); JPanel panel4 = new JPanel();
panel4.setPreferredSize(new Dimension(700, 150));
JButton b1 = new JButton("Validate");
panel4.add(b1);
JButton b2 = new JButton("Reset");
panel4.add(b2);
add(panel4); FlowLayout flowLayout = new FlowLayout();
this.setLayout(flowLayout);
this.setTitle("Students Detail");
this.setBounds(200, 200, 800, 400);
this.setVisible(true);
this.setDefaultCloseOperation(DISPOSE_ON_CLOSE); b1.addActionListener(new ActionListener() { @Override
public void actionPerformed(ActionEvent e) {
String xueli = j2.getSelectedItem().toString();
System.out.println("Name:" + j1.getText());
System.out.println("Qualification:" + xueli);
String hobbystring = "Hobby:";
if (c1.isSelected()) {
hobbystring += "Reading";
}
if (c2.isSelected()) {
hobbystring += "Singing";
}
if (c3.isSelected()) {
hobbystring += "Dancing";
}
System.out.println("Address:" + j3.getText());
if (jr1.isSelected()) {
System.out.println("Sex:Male");
}
if (jr2.isSelected()) {
System.out.println("Sex:Female");
}
System.out.println(hobbystring);
}
});
b2.addActionListener(new ActionListener() { @Override
public void actionPerformed(ActionEvent e) {
j1.setText(null);
j3.setText(null);
j2.setSelectedIndex(0);
c1.setSelected(false);
c2.setSelected(false);
c3.setSelected(false);
bu.clearSelection();
}
});
} public static void main(String args[]) {
new test();
} }
(1) 用户信息输入界面如下图所示:
(1)用户点击提交按钮时,用户输入信息显示控制台界面;
(2)用户点击重置按钮后,清空用户已输入信息;
(3)点击窗口关闭,程序退出。
练习2:采用GUI界面设计以下程序:
l 编制一个程序,将身份证号.txt 中的信息读入到内存中;
l 按姓名字典序输出人员信息;
l 查询最大年龄的人员信息;
l 查询最小年龄人员信息;
l 输入你的年龄,查询身份证号.txt中年龄与你最近人的姓名、身份证号、年龄、性别和出生地;
l 查询人员中是否有你的同乡。
l 输入身份证信息,查询所提供身份证号的人员信息,要求输入一个身份证数字时,查询界面就显示满足查询条件的查询结果,且随着输入的数字的增多,查询匹配的范围逐渐缩小。
package demo1; import java.awt.*;
import javax.swing.*; public class ButtonTest {
public static void main(String[] args) {
EventQueue.invokeLater(() -> {
JFrame frame = new Main();
frame.setTitle("身份证");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
});
}
}
package demo1; 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.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Scanner;
import java.awt.*;
import javax.swing.*;
import java.awt.event.*; public class Main extends JFrame {
private static ArrayList<Student> studentlist;
private static ArrayList<Student> list;
private JPanel panel;
private JPanel buttonPanel;
private static final int DEFAULT_WITH = 600;
private static final int DEFAULT_HEIGHT = 300; public Main() {
studentlist = new ArrayList<>();
Scanner scanner = new Scanner(System.in);
File file = new File("C:\\Users\\ASUS\\Desktop\\身份证号.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 number = linescanner.next();
String sex = linescanner.next();
String age = linescanner.next();
String province = linescanner.nextLine();
Student student = new Student();
student.setName(name);
student.setnumber(number);
student.setsex(sex);
int a = Integer.parseInt(age);
student.setage(a);
student.setprovince(province);
studentlist.add(student); }
} catch (FileNotFoundException e) {
System.out.println("学生信息文件找不到");
e.printStackTrace();
} catch (IOException e) {
System.out.println("学生信息文件读取错误");
e.printStackTrace();
}
panel = new JPanel();
panel.setLayout(new BorderLayout());
JTextArea jt = new JTextArea();
panel.add(jt);
add(panel, BorderLayout.NORTH);
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, 60, 30);
jButton1.setBounds(110, 90, 60, 30);
jt1.setBounds(110, 90, 60, 30);
jt2.setBounds(110, 90, 60, 30);
jt3.setBounds(110, 90, 60, 30);
jButton2.setBounds(110, 90, 60, 30);
jButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
Collections.sort(studentlist);
jt.setText(studentlist.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 < studentlist.size(); i++) {
j = studentlist.get(i).getage();
if (j > max) {
max = j;
k1 = i;
}
if (j < min) {
min = j;
k2 = i;
} }
jt.setText("年龄最大:" + studentlist.get(k1) + "年龄最小:" + studentlist.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 < studentlist.size(); i++) {
if (studentlist.get(i).getprovince().substring(1, 4).equals(place)) {
text+="\n"+studentlist.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 - studentlist.get(near).getage();
jt.setText("年龄相近:" + studentlist.get(near));
}
});
jt3.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
list = new ArrayList<>();
Collections.sort(studentlist);
String key = jt3.getText();
for (int i = 1; i < studentlist.size(); i++) {
if (studentlist.get(i).getnumber().contains(key)) {
list.add(studentlist.get(i));
jt.setText("emmm!你可能是:\n" + list);
//System.out.println("可能的人:" + studentlist.get(i));
//jt.setText("可能的人:" + studentlist.get(i));
}
}
}
});
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_WITH, DEFAULT_HEIGHT);
} public static int agenear(int age) {
int min = 53, value = 0, k = 0;
for (int i = 0; i < studentlist.size(); i++) {
value = studentlist.get(i).getage() - age;
if (value < 0)
value = -value;
if (value < min) {
min = value;
k = i;
}
}
return k;
} } Main
package demo1; public class Student implements Comparable<Student> { private String name;
private String number ;
private String sex ;
private int age;
private String province; public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getnumber() {
return number;
}
public void setnumber(String number) {
this.number = number;
}
public String getsex() {
return sex ;
}
public void setsex(String sex ) {
this.sex =sex ;
}
public int getage() { return age;
}
public void setage(int age) {
// int a = Integer.parseInt(age);
this.age= age;
} public String getprovince() {
return province;
}
public void setprovince(String province) {
this.province=province ;
} public int compareTo(Student o) {
return this.name.compareTo(o.getName());
} public String toString() {
return name+"\t"+sex+"\t"+age+"\t"+number+"\t"+province+"\n";
}
} Student
练习3:采用GUI界面设计以下程序
l 编写一个计算器类,可以完成加、减、乘、除的操作
l 利用计算机类,设计一个小学生100以内数的四则运算练习程序,由计算机随机产生10道加减乘除练习题,学生输入答案,由程序检查答案是否正确,每道题正确计10分,错误不计分,10道题测试结束后给出测试总分;
l 将程序中测试练习题及学生答题结果输出到文件,文件名为test.txt。
package ui_test; import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList; import javax.swing.*; public class MyExGUI extends JFrame {
ArrayList<String> user_zongti = new ArrayList<String>();
ArrayList<String> user_zonganswer = new ArrayList<String>();
ArrayList<String> user_answer = new ArrayList<String>();
ArrayList<String> true_answer = new ArrayList<String>();
ArrayList<String> jta_timu = new ArrayList<String>();
ArrayList<String> jta_zong = new ArrayList<String>();
ArrayList<Integer> user_fenshu = new ArrayList<Integer>();
JMenuBar jm; // 菜单条组件
JMenu menu;// 菜单
JMenuItem item1, item2;// 菜单项
JMenu build; // 二级菜单
JMenuItem file, project;
TextArea answer_all = new TextArea();
TextField jta = new TextField();
TextField jta_answer = new TextField();
JLabel num_answer = new JLabel();
JLabel answer;
JToolBar jtb;// 工具条
JButton jb1, jb2, jb3, jb4, jb5, jb6, jb7, jb_next;
int answer_count;
int answer_fenshu; public MyExGUI() {
// 创建菜单
jm = new JMenuBar(); menu = new JMenu("文件(F)");
menu.setMnemonic('f'); // 助记符 build = new JMenu("新建"); file = new JMenuItem("文件");
project = new JMenuItem("答题");
item1 = new JMenuItem("保存(S)");
item2 = new JMenuItem("退出"); answer = new JLabel("第 1 题"); // 添加菜单项至菜单上
build.add(file);
build.add(project); menu.add(build);
menu.add(item1);
menu.add(item2);
menu.addSeparator();
// 将菜单加入至菜单栏
jm.add(menu); JPanel contentPanel = new JPanel();
contentPanel.setLayout(null);
JLabel daan = new JLabel("答案");
JLabel dengyu = new JLabel("=");
num_answer = answer;
num_answer.setFont(new Font("宋体", Font.BOLD, 22));
jb_next = new JButton("下一题");
jta.setFont(new Font("宋体", Font.BOLD, 22));
jta_answer.setFont(new Font("宋体", Font.BOLD, 22));
jb_next.setFont(new Font("宋体", Font.BOLD, 22));
daan.setFont(new Font("宋体", Font.BOLD, 22));
dengyu.setFont(new Font("宋体", Font.BOLD, 22)); contentPanel.add(num_answer);
contentPanel.add(daan);
contentPanel.add(dengyu);
contentPanel.add(jta); contentPanel.add(jta_answer);
contentPanel.add(answer_all);
contentPanel.add(jb_next); num_answer.setBounds(90, 20, 130, 50);
daan.setBounds(250, 20, 90, 50);
jta.setBounds(50, 70, 150, 30);
dengyu.setBounds(205, 70, 20, 20);
jta_answer.setBounds(230, 70, 100, 30);
jb_next.setBounds(350, 70, 110, 30);
answer_all.setBounds(50, 120, 400, 300); this.setJMenuBar(jm); // 添加菜单栏,不能设定位置,会自动放在最上部
this.add(contentPanel); this.setTitle("在线答题系统");
this.setSize(600, 500);
this.setVisible(true);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
item1.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
FileOutputStream outSTr = null;
BufferedOutputStream Buff = null;
boolean flag = true;
File file;
// String test ;
do {
// test = "test"+count; String inputValue = JOptionPane.showInputDialog("Please input file name");
file = new File(inputValue + "test.txt");
if (!file.exists()) {
// 创建文件
try { flag = file.createNewFile(); } catch (IOException e) {
e.printStackTrace(); }
flag = false;
} else { JOptionPane.showMessageDialog(null, "该文件名已存在,请重新输入", "ERROR", JOptionPane.ERROR_MESSAGE);
flag = true;
}
} while (flag);
// 写入文件
String u_answer;
try {
outSTr = new FileOutputStream(file);
Buff = new BufferedOutputStream(outSTr);
System.out.println("选择是后执行的代码" + user_zongti.size() + user_answer.size());
for (int i = 0; i < user_zongti.size(); i++) {
try {
Buff.write(user_zongti.get(i).getBytes());
Buff.write(" ".getBytes());
u_answer = user_answer.get(i);
if (u_answer.equals(""))
u_answer = "没有作答"; Buff.write(u_answer.getBytes());
Buff.write("\r\n".getBytes());
} catch (IOException e) {
e.printStackTrace();
i--;
}
}
Buff.flush();
Buff.close(); } catch (IOException e) {
e.printStackTrace();
}
try {
outSTr.close();
} catch (IOException e) {
e.printStackTrace();
}
user_zongti.clear();
user_answer.clear();
}
}); project.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
arithmetic art = new arithmetic();
true_answer = art.list_answer;
jta_timu = art.list_timu;
jta_zong = art.list;
answer_count = 1;
answer_all.setText("");
for (int i = 0; i < art.list_timu.size(); i++) {
user_zongti.add(jta_zong.get(i));
answer_all.append(jta_timu.get(i));
answer_all.append("\r\n");
}
num_answer.setText("第 " + answer_count + " 题");
jta.setText(jta_timu.get(answer_count - 1));
answer_count++; }
});
jb_next.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
String temp;
temp = jta_answer.getText(); if (jta.getText().equals("")) {
JOptionPane.showMessageDialog(null, "错误,请导入题库", "错误", JOptionPane.ERROR_MESSAGE);
return;
}
jta_answer.setText("");
if (answer_count <= 10) {
if (isInteger(temp)) { user_answer.add(temp);
System.out.println("选择否后执行的代码" + temp + "user_size" + user_answer.size());
num_answer.setText("第 " + answer_count + " 题");
jta.setText(jta_timu.get(answer_count - 1));
answer_count++;
} else {
JOptionPane.showMessageDialog(null, "错误", "请输入数字", JOptionPane.ERROR_MESSAGE);
}
} else {
user_answer.add(temp);
System.out.println("选择否后执行的代码" + temp + "user_size" + user_answer.size());
answer_fenshu = 0;
for (int i = 0; i < user_answer.size(); i++) {
if (user_answer.get(i).equals(true_answer.get(i)))
answer_fenshu += 5;
}
user_fenshu.add(answer_fenshu);
Object[] options = { "是", "取消" };
int res = JOptionPane.showOptionDialog(null, "是否查看成绩", "答题完毕", JOptionPane.DEFAULT_OPTION,
JOptionPane.YES_NO_OPTION, null, options, options[0]);
if (res == JOptionPane.YES_OPTION) {
chart ct = new chart(user_fenshu);
ct.setVisible(true); } else {
Object[] option = { "是", "取消" };
int res1 = JOptionPane.showOptionDialog(null, "是否退出程序", "终止框", JOptionPane.DEFAULT_OPTION,
JOptionPane.YES_NO_OPTION, null, option, option[0]); if (res1 == JOptionPane.YES_OPTION) {
dispose();
System.exit(0); } else { } } } }
}); item2.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
dispose();
System.exit(0);
}
}); } public static boolean isInteger(String str) {
for (int i = str.length(); --i >= 0;) {
if (!Character.isDigit(str.charAt(i))) {
return false;
}
}
return true;
}
}
package ui_test; public class Main { public static void main(String[] args) {
MyExGUI lg = new MyExGUI();
//new MyExGUI(); } }
package ui_test; import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Random;
import java.util.Scanner; public class arithmetic {
ArrayList<String> list = new ArrayList<String>();
ArrayList<String> list_timu = new ArrayList<String>();
ArrayList<String> list_answer = new ArrayList<String>(); public arithmetic() {
FileOutputStream outSTr = null;
BufferedOutputStream Buff = null;
int number_n = 10, count; ArrayList<String> list_temp = new ArrayList<String>();
String[] operator = new String[] { "+", "-", "*", "/" }; Random rand = new Random();
File file1 = new File("test.txt");
if (file1.exists()) {
// 创建文件
try {
file1.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
} while (number_n > 0) {
int[] number_temp = new int[rand.nextInt(2) + 3];
String[] str_temp = new String[number_temp.length - 1];
for (int i = 0; i < number_temp.length; i++) {
if (i < number_temp.length - 1) {
number_temp[i] = rand.nextInt(100);
list_temp.add(String.valueOf(number_temp[i]));
str_temp[i] = operator[rand.nextInt(4)];
list_temp.add(str_temp[i]); } else {
number_temp[i] = rand.nextInt(100);
list_temp.add(String.valueOf(number_temp[i]));
}
} count = calculate_RPN(produce_RPN(list_temp));
if (count != -1) {
list_timu.add(transform_string(list_temp));
list_answer.add(String.valueOf(count));
list_temp.add(" = " + count);
list.add(transform_string(list_temp));
number_n--;
list_temp.clear();
} else
list_temp.clear();
System.out.println(number_n); }
try {
outSTr = new FileOutputStream(file1);
Buff = new BufferedOutputStream(outSTr);
for (int i = 0; i < list.size(); i++) {
try {
Buff.write(list.get(i).getBytes());
Buff.write("\r\n".getBytes());
} catch (IOException e) {
e.printStackTrace();
i--;
}
}
Buff.flush();
Buff.close(); } catch (IOException e) {
e.printStackTrace();
}
// Buff.close();
try {
outSTr.close();
} catch (IOException e) {
e.printStackTrace();
} for (int i = 0; i < list.size(); i++) {
System.out.print(list.get(i));
System.out.println();
}
System.out.print("计算完毕!"); } public static int calculate_RPN(ArrayList<String> list_temp) {
int i = 0, t;
double a = 0, b = 0;
String l_temp;
Stack sk = new Stack(10);
for (t = 0; t < list_temp.size(); t++) {
l_temp = list_temp.get(i++);
if (!isInteger(l_temp)) {
b = sk.mypop();
a = sk.mypop();
switch (l_temp) {
case "+":
sk.mypush(a + b);
break;
case "-":
if(!(a<b)) {
sk.mypush(a - b);
}
else
return -1;
break;
case "*":
sk.mypush(a * b);
break;
case "/":
if (b == 0||a<b)
return -1;
sk.mypush(a / b);
break;
}
System.out.println("st.mytop: " + sk.mypeek());
} else {
sk.mypush((double) Integer.parseInt(l_temp));
} }
if (!sk.myisempty()) {
a = sk.mypop();
b = a - (int) a;
System.out.println("a: " + a);
if (a > 0 && b == 0) {
return (int) a;
} else
return -1;
} else
return -1; } public static ArrayList<String> produce_RPN(ArrayList<String> list_temp) {
int t = 0, i = 0;
String tmp;
Tack mytack = new Tack(10);
ArrayList<String> lt_temp = new ArrayList<String>();
while (true) {
tmp = list_temp.get(i++);
if (isInteger(tmp)) {
lt_temp.add(tmp);
} else {
if (mytack.myisempty()) {
mytack.mypush(tmp);
} else {
if (isCPriority(tmp, mytack.mypeek()))
mytack.mypush(tmp);
else {
lt_temp.add(mytack.mypop());
mytack.mypush(tmp);
} }
}
if (i >= list_temp.size()) {
while (!mytack.myisempty())
lt_temp.add(mytack.mypop());
System.out.println(transform_string(list_temp));
list_temp = lt_temp;
System.out.println(list_temp);
return list_temp;
}
} } public static boolean isInteger(String str) {
for (int i = str.length(); --i >= 0;) {
if (!Character.isDigit(str.charAt(i))) {
return false;
}
}
return true;
} public static boolean isCPriority(String str, String s) {
if ((str + s).equals("*+") || (str + s).equals("*-") || (str + s).equals("/+") || (str + s).equals("/-"))
return true;
else
return false;
} public static String transform_string(ArrayList<String> list_temp) {
String s = "";
for (int i = 0; i < list_temp.size(); i++) {
s += list_temp.get(i);
}
return s; } static class Stack {
int mytop;
double stk[]; public Stack(int num) {
mytop = -1;
stk = new double[num];
} /* 出栈 */
double mypop() {
double peek = stk[mytop];
mytop--;
return peek;
} /* 入栈 */
void mypush(double x) {
mytop++;
stk[mytop] = x; } /* 判空 */
Boolean myisempty() {
if (mytop == -1)
return true;
else
return false;
} /* 取栈顶元素 */
double mypeek() {
double peek = stk[mytop];
return peek;
} /* 栈大小 */
int mysize() {
return mytop + 1;
}
} static class Tack {
int mytop;
String tk[]; public Tack(int num) {
mytop = -1;
tk = new String[num];
} /* 出栈 */
String mypop() {
String peek = tk[mytop];
mytop--;
return peek;
} /* 入栈 */
void mypush(String x) {
mytop++;
tk[mytop] = x; } /* 判空 */
Boolean myisempty() {
if (mytop == -1)
return true;
else
return false;
} /* 取栈顶元素 */
String mypeek() {
String peek = tk[mytop];
return peek;
} /* 栈大小 */
int mysize() {
return mytop + 1;
} } } arithmetic
package ui_test; import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.util.ArrayList;
import java.util.Random; import javax.swing.JFrame; public class chart extends JFrame{
//绘制柱形统计图
ArrayList<Integer> ran=new ArrayList<Integer>();
public chart(ArrayList<Integer> scores)
{
super();
getContentPane().setForeground(Color.CYAN);
setForeground(Color.CYAN);
setBackground(Color.CYAN);
for(int i=0;i<scores.size();i++)
{
ran.add(scores.get(i));
System.out.println(scores.get(i));
} setTitle("绘制柱形图");
setSize(600, 400);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
@Override
public void paint(Graphics g){
int Width = getWidth();
int Height = getHeight();
int leftMargin = 20;//柱形图左边界
int topMargin = 50;//柱形图上边界
Graphics2D g2 = (Graphics2D) g;
g2.setColor(Color.WHITE);//绘制白色背景
g2.fillRect(0, 0, Width, Height-100);//绘制矩形图
g2.setColor(Color.black);
for(int i=0;i<=10;i++)
{
//绘制灰色横线和百分比
g2.drawString((100-10*i)+" ", 15, topMargin+30*i);
g2.drawLine(10, topMargin+30*i, Width, topMargin+30*i);//绘制灰色横线
}
g2.setColor(Color.RED);
for(int i=0;i<=ran.size();i++)
{
//绘制柱形图
int step = (i+1)*40;//设置每个柱形图的水平间隔为40
//绘制矩形
g2.fillRoundRect(leftMargin+step*2-5,(100-ran.get(i))*3+50, 40, 300-(100-ran.get(i))*3, 40, 10);
//列出测试轮数
g2.drawString("第"+(i+1)+"轮", leftMargin+step*2, 380);
}
} } chart
任务3:本学期课程已结束,请汇总《面向对象程序设计课程学习进度条》的数据,统计个人专业能力提升的数据。并从学习内容、学习方法、学习心得几个方面进行课程学习总结,也希望你对课程的不足提出建议和意见。
实验总结:
总复习纲要
Java语言特点与开发环境配置(第1章、第2章)
Java基本程序结构(第3章)
Java面向对象程序结构(第4章、第5章、第6章)
类、类间关系、类图
Java JDK预定义类/接口及其API(String-第3章、
Arrays-第3章、Files-第3章62页、LocalDate-第4章、
Object-第5章、对象包装器-第5章、Comparator-第6章、
异常类-第7章、ArrayList-第5+8章、第第9章、第10-12章、
第14章)
— Java异常处理编程模型
— Java GUI编程模型
Java并发程序设计(第14章)
Java应用程序部署(第13章)
JAVA特点
简单的、面向对象的、分布式的、强壮的、安全的、
体系结构中立的、可移植的、解释型的、高性能的、
多线程的、动态的语言。
JDK的安装及配置
JDK平台提供的Java编译器(javac.exe)和
Java解释器(java.exe)位于Java安装目录的
bin文件夹中,为了能在任何目录中使用编译器
和解释器,应在系统特性中设置Path
JDK的安装及配置
JDK安装目录的jre文件夹中包含着Java应用程
序运行时所需要的Java类库,这些类库被包含在jre\lib目录下的压缩文件rt.jar中
一个Java程序的开发过程
源文件的命名规则
如果源文件中有多个类,那么只能有一个类是public类。如果有一个类是public类,那么源文件的名字必须与这个类的名字完全相同,扩展名是.java。 如果源文件没有public类,那么源文件的名字只要和某个类的名字相同,并且扩展名是.java就可以了。 标识符、关键字和数据类型
Java标识符的组成
熟悉Java关键字 Java数据类型 Java一维数组的定义、初始化和数组元素 的引用Java数据类型
运算符与表达式
算术运算符,关系运算符,逻辑运算符,位运算符,赋值运算符,其他运算符
Java流程控制语句
控制语句, if语句, switch语句, 循环语句, while, do…while, for,break和continue语句, break——跳出switch结构;终止并跳出循环体。, continue——结束本次循环。
类、对象、继承和接口
类声明
class People
{
…
}
类体内容由两部分构成:
类成员变量:用来刻画类属性;
类成员方法:用来刻画类内操作。
局部变量
– 在方法体中定义的变量和方法的参数被称为局部变量。 类成员变量和局部变量的区别 类成员变量在整个类内都有效,局部变量只在定义它的方法内有效。
如果局部变量的名字与成员变量的名字相同,则成员变量被隐藏。
类成员方法
—方法的定义包括两部分:方法声明和方法体。
构造方法
—名字必须与类名完全相同,没有返回值类型;
—构造方法可以重载;
—每个类至少有一个构造方法,若程序员没有定义构造方法,系统会自动产生一个默认构造方法,这个默认构造方法无参数,方法体为空;
—程序员为类定义了构造方法,系统就不再提供默认构造方法;
— 用途:初始化类对象。
方法重载
—一个类中可以有多个具有相同的名字的方法。但这些方法或者是参数的个数不同,或者是参数的类型不同创建对象需两个步骤:对象声明和为对象分配内存
—对象声明格式为:
类名 对象名字;
如:People zhangPing;
—为声明对象分配内存格式如下:
对象名= new 构造方法名(参数表);
如: zhangPing=new People();
—对象创建常用格式为:
类名 对象名= new 构造方法名(参数表);;类、对象、继承和接口 通过使用运算符“.”,对象可以实现对所属类具有访问权限的成员变量访问和成员方法调用。 没有分配内存的对象称作空对象,空对象不能使用,即不能让空对象去调用方法。类、对象、继承和接口
Static关键字
– 用static修饰的成员变量称为类(静态)变量
– 用static修饰的方法称为类(静态)方法
实例变量和类变量的区别
– 如果类的成员变量有类变量,那么该类所有对象的类变量内存是相同的。
– 具有访问权限的类变量可以通过某个对象访问,也可
以通过类名访问。
– 具有访问权限的实例变量仅可以通过对象访问,不能使用类名访问。类、对象、继承和接口实例方法和类方法的区别
– 实例方法可以被类创建的任何对象调用执行。
– 类方法不仅可以被类创建的任何对象调用执行,也可以直接通过类名调用 。
说明:
- 类方法可以调用其它类方法
- 类方法只能访问static成员变量
- 类方法不能以任何形式引用this和super
- 实例方法既可以访问实例成员变量也可访问类成员变量
- 实例方法既可以调用实例方法也可以调用类方法
this关键字
- this表示类的当前对象。
- this可以出现在实例方法和构造方法中,但不可以出现在类方法中。
- this关键字出现在构造方法中时,代表使用该构造方法所创建的对象。
- this出现在类的实例方法中时,代表正在调用该方法的当前对象。
实现类继承的方式
在类的声明中,通过使用关键字extends来创建一个类的子类,格式如下:
class 子类名 extends 父类名
{
…
}
类、对象、继承和接口
继承的规定
- Java只支持单继承,不允许多继承
- Java允许有多层继承
方法的重写
- 方法重写是指:子类中定义一个方法,这个方法的名字、返回类型、参数个数和类型与从父类继承的方法完全相同。
- 子类重写父类,被重写的方法不能比父类拥有更严格的访问权限方法重载与方法重写的区别
成员变量的隐藏
- 子类中定义的成员变量和父类中的成员变量同名时,子类就隐藏了继承的成员变量 。
super关键字
- 子类中访问父类中被隐藏的成员变量
- super.成员变量
- 子类调用父类中的方法
调用父类中的特定构造方法
super()
调用父类中被重写的方法
super.方法()
类、对象、继承和接口
子类对象与父类对象之间的转换
- 子类对象向父类对象转换,自动转型 父类对象=子类对象
- 父类对象向子类对象转换,强制转型 子类对象=(子类)父类对象类、对象、继承和接口多态性有两种表现形式:
①方法的多态性(方法重载)
②对象的多态性
对象多态性是在继承应用上的一种扩展类、对象、继承和接口final关键字
- final关键子可修饰类、方法成员、成员变量和方法中的参数。
- final类不能被继承,即不能有子类
- 方法被修饰为final方法,则这个方法不能被重写。
- 一个成员变量被修饰为final的,就是常量,常量必须赋给初值,而且不能再发生变化。
- 方法的参数被修饰为final的,该参数的值不能被改变。
类、对象、继承和接口
抽象类
- 用关键字abstract修饰的类称为abstract类(抽象类)。
abstract class A
{
„
}
- abstract类不能被实例化;
- abstract类可以有abstract方法;
- 对于abstract方法,只允许声明,不允许实现,且要用
abstract关键字进行修饰;
- 抽象类的子类必须重写所有的抽象方法。
类、对象、继承和接口
Java语言不支持多继承性,即一个类只能有一个父类。单继承性使得Java简单,易于管理程序。为了克服单继承的缺点,Java使用了接口,一个类可以实现多个接口。
成员变量的隐藏
- 子类中定义的成员变量和父类中的成员变量同名时,子类就隐藏了继承的成员变量 。
super关键字
- 子类中访问父类中被隐藏的成员变量
- super.成员变量
- 子类调用父类中的方法
调用父类中的特定构造方法
super()
调用父类中被重写的方法
super.方法()
子类对象与父类对象之间的转换
- 子类对象向父类对象转换,自动转型 父类对象=子类对象
- 父类对象向子类对象转换,强制转型 子类对象=(子类)父类对象
多态性有两种表现形式:
①方法的多态性(方法重载)
②对象的多态性
对象多态性是在继承应用上的一种扩展
final关键字
- final关键子可修饰类、方法成员、成员变量和方法中的参数。
- final类不能被继承,即不能有子类
- 方法被修饰为final方法,则这个方法不能被重写。
- 一个成员变量被修饰为final的,就是常量,常量必须赋给初值,而且不能再发生变化。
- 方法的参数被修饰为final的,该参数的值不能被改变。类、对象、继承和接口
抽象类
- 用关键字abstract修饰的类称为abstract类(抽象类)。
abstract class A
{
„
}
- abstract类不能被实例化;
- abstract类可以有abstract方法;
- 对于abstract方法,只允许声明,不允许实现,且要用
abstract关键字进行修饰;
- 抽象类的子类必须重写所有的抽象方法。、对象、继承和接口
Java语言不支持多继承性,即一个类只能有一个父类。单继承性使得Java简单,易于管理程序。为了克服单继承的缺点,Java使用了接口,一个类可以实现多个接口。
接口的声明与使用
- 关键字interface来定义一个接口。
- 接口的定义与类的定义相似,包括接口的声明和接口体。
- 接口体中包含常量定义和抽象方法定义两部分。
如: interface Printable {
int MAX=100;
float sum(float x ,float y);
}
接口使用规则
- 一个类可以实现多个接口;
- 如果一个类使用了某个接口,那么这个类必须实现该接口的所有方法,即为这些方法提供方法体。
class 类名 implements 接口A,接口B
{
…
}
一个新的接口用extends关键字去继承一个已有的接口,实现接口的多继承
interface 接口A extends 接口1,接口2,接口3,接口4
{
…
}
接口与抽象类的区别
package语句
- 必须是源文件中的第一条语句。在package语句之前,除了空白和注释之外不能有任何语句。
- 如果不加package语句,则指定为缺省包或无名包。
- 包对应着文件系统的目录层次结构。
- 在package语句中,用“.”来指明包(目录)的层次。
类、对象、继承和接口
引入包中的类
import java.io.File;
引入整个包
import java.io.*;
java默认导入的包
java.lang.*
在同一包中的类可以互相引用,无需import语句。
类的访问权限修饰符
- public
当两个类不在同一个包中时,允许外部类访问
- default 不能让不同包的外部类访问,但可以在同一个包中不同类之间访问类的其它修饰符
- final
- abstract
方法的权限访问修饰符
- public
- protected
- default(不加访问说明符时)
- private 方法的其它修饰符
- static
- final
- abstract
- synchronized(多线程中介绍)
public protected default privat
内部类
- Java支持在一个类中声明另一个类,这样的类称作内部类,而包含内部类的类成为内部类的外嵌类。
- 内部类的类体中不可以声明类变量和类方法。外嵌类的类体中可以用内部类声明对象,作为外嵌类的成员。
匿名内部类
- 匿名内部类没有类名,所以创建匿名内部类时同时创建匿名内部类的对象
- 创建匿名内部类的语法格式如下所示
Lambda表达式
- Java 8 引入的一个新的功能,主要用途是提供一个函数化的语法来简化编码。
- Lambda表达式本质上是一个匿名方法。
类、类间关系、类图
类和类之间关系: is a,has a, use a
- is a: 继承,实现关系
- has a: 组合,聚合,关联关系
- use a: 依赖关系
继承关系
实现关系
public class Animal{}
public class Dog extends Animal{}
public interface UserService{}
public class UserService implements UserService{}
组合关系
public class Heart{}
publid class Stomach{}
public class Person{
private Heart heart;
private Stomach stomach;
public Person(){
this.heart=new Heart();
this.stomach=new Stomach();
}
}
聚合关系
public class Engine{}
public class Gearbox{}
publicc lass Car{
private Engine engine;
private Gearbox gearbox;
public Car(Engine engine, Gearbox gearbox){
this.engine=engine;
this. gearbox=gearbox;
}
}
关联关系
public class Car{}
public class Person{
private Car car;
public void setCar(){
this.car=car;
}
}
依赖关系
public class Train{
public void move(){}
}
public class Person{
public void move(Train train){
train.move();
}
}
类图:在OO程序设计中,进行类关系分析与设计的工具
JDK预定义类及其API
JDK中预定义类API使用要求:
- 导入类所在的包;
- 掌握预定义类的名称及其用途;
- 掌握预定义类中定义的常用方法、方法参数要求、返回值类型
异常处理编程模型
捕获异常编程框架
try
{
//此处是可能出现异常的代码
}
catch(Exception e)
{
//此处是如果发生异常的处理代码
}
finally
{
//此处是肯定被执行的代码
}
抛出异常
- throws语句是在方法的声明中使用来抛出异常,用来指定方法可能抛出异常,但不想在当前方法中处理这个异常。
- throw语句是在方法体内使用抛出异常类的对象,程序在执行到throw语句时立即终止,它后面的语句都不执行。
- 要捕捉throw抛出的异常,则必须使用try-catch语句。
异常处理编程模型
创建自定义异常类(*)
定义 extends Exception的子类
异常处理
Java GUI编程模型
掌握java.awt和java.swing包中各种
GUI定义需
要的组件创建以及常用方法
Java中的事件处理机制
- 事件由用户操作某个组件对象产生,被操作组件称为事件源。
- 一个组件能响应哪些事件,响应事件后需执行的语句序列存放在什么位置,这些功能由事件监视器负责。
- 事件监视器是某个实现了监听器接口类的对象。
-创建GUI中事件源,开发程序时,程序员需要做以下2件事:
向事件源注册事件监视器
例如,文本框的事件监听器注册方法是:
addActionListener(监视器);
创建该监视器对象的类,声明实现相应的接口 在类中实现接口中要求的事件处理方法
Java GUI编程模型
Java中的每个事件类都有一个相应的监视器接口,接口中声明了一个或多个抽象的事件处理方法。如果一个类实现事件监视器接口,其对象就可以作为对应事件的监视器,具备监视和处理事件的能力。
Java GUI编程模型
GUI设计中编写事件处理程序代码
必须确定事件源与事件监视器事件源的选择通常比较容易,事件监视器必须是实现事件监视器接口的类对象
Soureobject.addXXXListener(监视器),将某个对象作为自己的监视器创建监视器对象的类必须实现相应的事件接口
Class A implements XXXListener
当事件源发生事件时,监视器将调用接口中的相应方法对事件进行处理