2 ingqi INGQI 于 2013.04.25 20:33 提问

.Java 中多个 class 的使用问题

背景:这是一个教科书上的计算器代码,因为代码中只有第一个是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);
    }
}

1个回答

csxrzeng
csxrzeng   2015.06.05 11:10

public class ClearButton extends CalculatorButton
这里不是还有一个public类

Csdn user default icon
上传中...
上传图片
插入图片