背景:这是一个教科书上的计算器代码,因为代码中只有第一个是public class,所以我放到同一个.java文件中。
过程:用sublime将代码抄到电脑里,在Eclipse中打开却发现是 class 调用错误。检查了一边发现代码和书中相同,找不到错误的地方,随后我为各个class建了各自的.java文档,想这次如果有错误就是书中代码错了,但……显示正常,运行ok。
坑爹,我把代码粘贴回原来的.java文档,复制文档+换文件夹,拷贝的文件没有显示错误。但是class的名字是黄色未被调用(这不是废话么?不能调用你还运行个什么)。我再点击修复,得到 private static final long serialVersionUID = 1L;
秉着打破砂锅问到底的精神,所以为什么第一次写上代码时是显示错误,复制粘贴之后又 ok 了呢?
private static final long serialVersionUID = 1L; 这个量的意义何在?
而且:只有 DigitButton 调用是 ok 的,剩下的AddButton、SubtractButton、MultiplyButton、ClearButton…ect 全是提示错误。OperatorButton 类被继承也是不可以的。
/** This program implements a simple four-function calculator */
public class come extends Program{
/* Initializes the user interface */
public void init(){
setLayout(new TableLayout(5,4));
display = new CalculatorDisplay();
add(display, "gridwidth=4 height=" + BUTTON_SIZE);
addButtons();
addActionListeners();
}
public void actionPerformed(ActionEvent e) {
Object source = e.getSource();
if(source instanceof CalculatorButton){
((CalculatorButton) source).action(display);
}
}
private void addButtons(){
String constraint = "width=" + BUTTON_SIZE + " height=" + BUTTON_SIZE;
add(new DigitButton(7), constraint);
add(new DigitButton(8), constraint);
add(new DigitButton(9), constraint);
add(new AddButton(), constraint);
add(new DigitButton(4), constraint);
add(new DigitButton(5), constraint);
add(new DigitButton(6), constraint);
add(new SubtractButton(), constraint);
add(new DigitButton(1), constraint);
add(new DigitButton(2), constraint);
add(new DigitButton(3), constraint);
add(new MultiplyButton(), constraint);
add(new ClearButton(), constraint);
add(new DigitButton(0), constraint);
add(new EqualsButton(), constraint);
add(new DivideButton(), constraint);
}
private static final int BUTTON_SIZE = 40;
private CalculatorDisplay display;
}
class CalculatorDisplay extends IntField{
/* Creates a new calculator display that is not directly editable by the user */
public CalculatorDisplay(){
setEditable(false);
setFont(new Font("SansSerif", Font.PLAIN, 24));
setValue(0);
startNewValue = false;
op = null;
}
/* Adds a digit to the display, clearing the old value if startNewValue is set */
public void addDigit(int digit){
int value = (startNewValue) ? 0 : getValue();
setValue(10 * value + digit);
startNewValue = false;
}
/* Sets a new operator, applying the previous one if one exists */
public void setOperator(OperatorButton button){
if (op == null){
memory = getValue();
} else {
memory = op.apply(memory, getValue());
setValue(memory);
}
op = button;
startNewValue = true;
}
/* private instance variables */
private OperatorButton op; /* The last operator button pressed */
private int memory; /* The value to which the operator is applied */
private boolean startNewValue; /* Set after an operator to start a new value */
}
/*
This abstract class is the superclass for every calculator button. Every button must define an action method, which is called whenever the button is cliked.
*/
abstract class CalculatorButton extends JButton {
/* Creates a new CalculatorButton with the specified name */
public CalculatorButton(String name) {
super(name);
setFont(new Font("SansSerif", Font.PLAIN, 24));
}
/* Called when the button is clicked (every subclass must implement this
method)
*/
public abstract void action(CalculatorDisplay display);
}
/*
This class is used for each of the digit buttons. The action consists of
adding the digit used as a label on the button, which is returned by getText.
*/
class DigitButton extends CalculatorButton {
/* Creates a new DigitButton for the digit n */
public DigitButton(int n) {
super("" + n);
}
/* Adds this digit to the display */
public void action(CalculatorDisplay display) {
display.addDigit(Integer.parseInt(getText()));
}
}
/*
This abstract class is the superclass of the various operator buttons.
Each concrete subclass must override the apply method.
*/
abstract class OperatorButton extends CalculatorButton{
/* Creates a new OperatorButton with the specified name */
public OperatorButton(String name) {
super(name);
}
/* Informs the display that this operator button has been clicked */
public void action(CalculatorDisplay display) {
display.setOperator(this);
}
/* Applies this operator (every subclass must implement this method) */
public abstract int apply(int lhs, int rhs);
}
/*
The classes AddButton, SubtractButton, MultipButton, and DicideButton
are the same except for their label and the implementation of apply.
*/
class AddButton extends OperatorButton {
public AddButton() { super("+"); }
public int apply(int lhs, int rhs) { return lhs + rhs; }
}
class SubtractButton extends OperatorButton {
public SubtractButton() { super("-"); }
public int apply(int lhs, int rhs) { return lhs - rhs; }
}
class MultiplyButton extends OperatorButton {
public MultiplyButton() { super("x"); }
public int apply(int lhs, int rhs) { return lhs * rhs; }
}
class DivideButton extends OperatorButton {
public DivideButton() { super("/"); }
public int apply(int lhs, int rhs) { return lhs / rhs; }
}
/*
The EqualsButton class displays the current value. As it happens, this
Operation can be implemented simply by setting the operator to null.
*/
class EqualsButton extends CalculatorButton {
public EqualsButton() {
super("C");
}
public void action(CalculatorDisplay display) {
display.setOperator(null);
display.setValue(0);
}
}
public class ClearButton extends CalculatorButton {
public ClearButton(){
super("C");
}
public void action(CalculatorDisplay display) {
display.setOperator(null);
display.setValue(0);
}
}