关于《全国计算机等级考试二级教程(Java语言程序设计)(2019年版)》中的一些代码错误的纠正
本人是Java语言的初学者,并且买了《全国计算机等级考试二级教程(Java语言程序设计)》这本教材,想通过自己的努力自学Java语言并通过国二考试,但是这本教材中的程序案例屡屡出现错误,让我这个初学者非常痛苦,这也说明了这些教材编写者的疏忽大意。我通过上网大量的搜索和学习,纠正了教材中的一些错误代码段,在这里分享给那些要考国二java考试并且买了这本教材的考生们。还有国二用的是jdk6,如果用别的版本运行,可能会出现一些错误,建议大家不要用别版本去学国二教材。
1.
80页
由于未导入相关方法包使程序运行错误。
书中原代码:例5.6 ObjectTest.java
1 public class ObjectTest
2 {
3 public static void main(String[] args)
4 {
5 Employee zhang1=new Employee("张浩",75000,1987,12,15);
6 Employee zhang2=zhang1;
7 Employee zhang3=new Employee("张浩",75000,1987,12,15);
8 Employee bob=new Employee("Bob Brandson",50000,1989,10,1);
9 System.out.println("zhang1==zhang2:"+(zhang1==zhang2));
10 System.out.println("zhang1==zhang3:"+(zhang1==zhang3));
11 System.out.println("zhang1.equals(zhang3):"+zhang1.equals(zhang3));
12 System.out.println("zhang1.equals(bob):"+zhang1.equals(bob));
13 System.out.println("bob.toString():"+bob);
14 Manager carl=new Manager("Carl Cracker",80000,1987,12,15);
15 Manager boss=new Manager("Carl Cracker",80000,1987,12,15);
16 boss.setBonus(5000);
17 System.out.println("boss.toString():"+boss);
18 System.out.println("carl.equals(boss):"+carl.equals(boss));
19 System.out.println("zhang1.hashCode():"+zhang1.hashCode());
20 System.out.println("zhang3.hashCode():"+zhang3.hashCode());
21 System.out.println("bob.hashCode():"+bob.hashCode());
22 System.out.println("carl.hashCode():"+carl.hashCode());
23 System.out.println("boss.hashCode():"+boss.hashCode());
24 }
25 }
26 class Employee
27 {
28
29 public Employee(String n,double s,int year,int month,int day)
30 {
31 name=n;
32 salary=s;
33 GregorianCalendar calendar=new GregorianCalendar(year,month-1,day);
34 hireDay=calendar.getTime();
35 }
36 public boolean equals(Object otherObject)
37 {
38 if(this==otherObject)return true;
39 if(otherObject==null)return false;
40 if(getClass()!=otherObject.getClass())return false;
41 Employee other=(Employee)otherObject;
42 return name.equals(other.name)&&salary==other.salary&&hireDay.equals(other.hireDay);
43 }
44 public int hashCode()
45 {
46 return 7*name.hashCode()+11*new Double(salary).hashCode()+13*hireDay.hashCode();
47 }
48 public String toString()
49 {
50 return getClass().getName()+"[name="+name+",salary="+salary+",hireDay="+hireDay+"]";
51 }
52 private String name;
53 private double salary;
54 private Date hireDay;
55 }
56 class Manager extends Employee
57 {
58 public Manager(String n,double s,int year,int month,int day)
59 {
60 super(n,s,year,month,day);
61 bonus=0;
62 }
63 public void setBonus(double b)
64 {
65 bonus=b;
66 }
67 public boolean equals(Object otherObject)
68 {
69 if(!super.equals(otherObject))
70 return false;
71 Manager other=(Manager)otherObject;
72 return bonus==other.bonus;
73 }
74 public int hashCode()
75 {
76 return super.hashCode()+17*new Double(bonus).hashCode();
77 }
78 public String toString()
79 {
80 return super.toString()+"[bonus="+bonus+"]";
81 }
82 private double bonus;
83 }
本人纠正后代码:
只是在代码开头导入包,加入两行代码即可,
1 import java.util.GregorianCalendar;
2 import java.util.Date;
3 public class ObjectTest
4 {
5 public static void main(String[] args)
6 {
7 Employee zhang1=new Employee("张浩",75000,1987,12,15);
8 Employee zhang2=zhang1;
9 Employee zhang3=new Employee("张浩",75000,1987,12,15);
10 Employee bob=new Employee("Bob Brandson",50000,1989,10,1);
11 System.out.println("zhang1==zhang2:"+(zhang1==zhang2));
12 System.out.println("zhang1==zhang3:"+(zhang1==zhang3));
13 System.out.println("zhang1.equals(zhang3):"+zhang1.equals(zhang3));
14 System.out.println("zhang1.equals(bob):"+zhang1.equals(bob));
15 System.out.println("bob.toString():"+bob);
16 Manager carl=new Manager("Carl Cracker",80000,1987,12,15);
17 Manager boss=new Manager("Carl Cracker",80000,1987,12,15);
18 boss.setBonus(5000);
19 System.out.println("boss.toString():"+boss);
20 System.out.println("carl.equals(boss):"+carl.equals(boss));
21 System.out.println("zhang1.hashCode():"+zhang1.hashCode());
22 System.out.println("zhang3.hashCode():"+zhang3.hashCode());
23 System.out.println("bob.hashCode():"+bob.hashCode());
24 System.out.println("carl.hashCode():"+carl.hashCode());
25 System.out.println("boss.hashCode():"+boss.hashCode());
26 }
27 }
28 class Employee
29 {
30
31 public Employee(String n,double s,int year,int month,int day)
32 {
33 name=n;
34 salary=s;
35 GregorianCalendar calendar=new GregorianCalendar(year,month-1,day);
36 hireDay=calendar.getTime();
37 }
38 public boolean equals(Object otherObject)
39 {
40 if(this==otherObject)return true;
41 if(otherObject==null)return false;
42 if(getClass()!=otherObject.getClass())return false;
43 Employee other=(Employee)otherObject;
44 return name.equals(other.name)&&salary==other.salary&&hireDay.equals(other.hireDay);
45 }
46 public int hashCode()
47 {
48 return 7*name.hashCode()+11*new Double(salary).hashCode()+13*hireDay.hashCode();
49 }
50 public String toString()
51 {
52 return getClass().getName()+"[name="+name+",salary="+salary+",hireDay="+hireDay+"]";
53 }
54 private String name;
55 private double salary;
56 private Date hireDay;
57 }
58 class Manager extends Employee
59 {
60 public Manager(String n,double s,int year,int month,int day)
61 {
62 super(n,s,year,month,day);
63 bonus=0;
64 }
65 public void setBonus(double b)
66 {
67 bonus=b;
68 }
69 public boolean equals(Object otherObject)
70 {
71 if(!super.equals(otherObject))
72 return false;
73 Manager other=(Manager)otherObject;
74 return bonus==other.bonus;
75 }
76 public int hashCode()
77 {
78 return super.hashCode()+17*new Double(bonus).hashCode();
79 }
80 public String toString()
81 {
82 return super.toString()+"[bonus="+bonus+"]";
83 }
84 private double bonus;
85 }
2.
86页例5.9 EnumTest.java这个程序是有问题的,但是我还没改过来,有改过来的希望给留言一下,教教我啊。
书中原码:
EnumTest.java
1 import java.util.*;
2 public class EnumTest
3 {
4 public static void main(String[] args)
5 {
6 Scanner in=new Scanner(System.in);
7 System.out.print("请输入服装号:(SMALL,MEDIUM,LARGE,EXTRA_LARGE,EXTRA_EXTRA_LARGE)");
8 String input=in.next().toUpperCase();
9 Size size=Enum.valueOf(Size.class,input);
10 System.out.println("size="+size);
11 System.out.println("abbreviation="+Size.getAbbreviation());
12 if(size==Size.EXTRA_LARGE^size==Size.EXTRA_EXTRA_LARGE)
13 {
14 System.out.println("很好!你注意到了下划线“_”。");
15 }
16 }
17 enum Size{SMALL("S"),MEDIUM("M"),LARGE("L"),EXTRA_LARGE("XL"),EXTRA_EXTRA_LARGE("XXL")};
18 private Size(String abbreviation)
19 {
20 this.abbreviation=abbreviation;
21 }
22 public String getAbbreviation()
23 {
24 return abbreviation;
25 }
26 private String abbreviation;
27 }
3.
129页,例7.3 ZipTest.java
其中两行代码可能是书写有误,我也没看懂啥意思,最后在网上查资料改了过来。
本人修正后代码:
1 import java.awt.*;
2 import java.awt.event.*;
3 import java.io.*;
4 import java.util.*;
5 import java.util.List;
6 import java.util.zip.*;
7 import javax.swing.*;
8 public class ZipTest {
9
10 public static void main(String[] args) {
11 // TODO Auto-generated method stub
12 EventQueue.invokeLater(new Runnable() {
13 public void run() {
14 ZipTestFrame frame=new ZipTestFrame();
15 frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
16 frame.setVisible(true);
17 }
18 });
19 }
20
21 }
22 class ZipTestFrame extends JFrame{
23 /**
24 *
25 */
26 private static final long serialVersionUID = 1L;
27 public ZipTestFrame() {
28 setTitle("ZipTest");
29 setSize(DEFAULT_WIDTH,DEFAULT_HEIGHT);
30 JMenuBar menuBar=new JMenuBar();
31 JMenu menu=new JMenu("File");
32 JMenuItem openItem=new JMenuItem("Open");
33 menu.add(openItem);
34 openItem.addActionListener(new ActionListener(){
35 public void actionPerformed(ActionEvent event) {
36 JFileChooser chooser=new JFileChooser();
37 chooser.setCurrentDirectory(new File("."));
38 int r=chooser.showOpenDialog(ZipTestFrame.this);
39 if(r==JFileChooser.APPROVE_OPTION) {
40 zipname=chooser.getSelectedFile().getPath();
41 fileCombo.removeAllItems();
42 scanZipFile();
43 }
44 }
45 });
46 JMenuItem exitItem=new JMenuItem("Exit");
47 menu.add(exitItem);
48 exitItem.addActionListener(new ActionListener() {
49 public void actionPerformed(ActionEvent event) {
50 System.exit(0);
51 }
52 });
53 menuBar.add(menu);
54 setJMenuBar(menuBar);
55 fileText=new JTextArea();
56 fileCombo=new JComboBox();
57 fileCombo.addActionListener(new ActionListener() {
58 public void actionPerformed(ActionEvent event) {
59 loadZipFile((String)fileCombo.getSelectedItem());
60 }
61 });
62 add(fileCombo,BorderLayout.SOUTH);
63 add(new JScrollPane(fileText),BorderLayout.CENTER);
64 }
65 public void scanZipFile() {
66 new SwingWorker<Void,String>(){
67 protected Void doInBackground()throws Exception{
68 ZipInputStream zin=new ZipInputStream(new FileInputStream(zipname));
69 ZipEntry entry;
70 while((entry=zin.getNextEntry())!=null) {
71 publish(entry.getName());
72 zin.closeEntry();
73 }
74 zin.close();
75 return null;
76 }
77 protected void process(List<String> names) {
78 for(String name:names)fileCombo.addItem(name);
79 }
80 }.execute();
81 }
82 public void loadZipFile(final String name) {
83 fileCombo.setEnabled(false);
84 fileText.setText("");
85 new SwingWorker<Void,Void>(){
86 protected Void doInBackground()throws Exception{
87 try {
88 ZipInputStream zin = new ZipInputStream(new FileInputStream(zipname));
89 ZipEntry entry;
90 while((entry=zin.getNextEntry())!=null) {
91 if(entry.getName().equals(name)) {
92 Scanner in=new Scanner(zin);
93 while(in.hasNextLine()) {
94 fileText.append(in.nextLine());
95 fileText.append("\n");
96 }
97 }
98 zin.closeEntry();
99 }
100 zin.close();
101 }
102 catch(IOException e) {
103 e.printStackTrace();
104 }
105 return null;
106 }
107 protected void done() {
108 fileCombo.setEnabled(true);
109 }
110 }.execute();
111 }
112 protected void ZipInputStream(FileInputStream fileInputStream) {
113 // TODO Auto-generated method stub
114
115 }
116 public static final int DEFAULT_WIDTH=400;
117 public static final int DEFAULT_HEIGHT=300;
118 private JComboBox fileCombo;
119 private JTextArea fileText;
120 private String zipname;
121 }
由于我书还没看完,先找到这基础错误,待我发现新的错误后继续和大家分享讨论。