09 简易计算器,回顾组合与内部类

发布时间 2023-08-06 13:25:30作者: 被占用的小海海

oop原则:组合大于继承
继承:class A extends B{}
组合:class A{public B b }

由面向过程逐步转变为面向对象
对象.方法

 package GUI;

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

/*oop原则:组合大于继承
继承:class A extends B{}
组合:class A{public B b }
*/
 // 简易计算器
public class Test09_Calc {
    public static void main(String[] args) {
      new Calculator();
    }
}

// 一个计算器窗口
class Calculator extends Frame{
    public Calculator()  {
        Calculator calculator;
        // 三个文本输入框,一个标签,一个按钮
        TextField num1=new TextField(10); // 字符数
        TextField num2=new TextField(10);
        TextField num3=new TextField(20);
        Label label=new Label("+");
        Button button=new  Button("=");
        button.addActionListener(new MyCalculatorLinstener(num1,num2,num3));  // 按钮监听事件
        // 布局
        setLayout(new FlowLayout());
        add(num1);
        add(label);
        add(num2);
        add(button);
        add(num3);
        pack();
        setVisible(true);



    }


}
// 监听器
class MyCalculatorLinstener implements ActionListener{
    // 首先获得三个参数
    TextField num1,num2,num3;


    public MyCalculatorLinstener(TextField num1,TextField num2,TextField num3) {
        this.num1=num1;
        this.num2=num2;
        this.num3=num3;
    }  // 有参构造

    @Override
    public void actionPerformed(ActionEvent e) {
        int n1=Integer.parseInt(num1.getText());  // 将String 转化为 int
        int n2=Integer.parseInt(num2.getText());
        num3.setText(""+(n1+n2));
    }
}

代码优化
使用组合

package GUI;

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;


// 优化代码
public class Test09_up {
    public static void main(String[] args) {
        new Calculator();
    }
}

class Calculator extends Frame {

    // 面向对象,分为方法和属性
    public Calculator()  {  // 这些东西要在构造器里面,主函数默认有构造器
        // 布局
        setLayout(new FlowLayout());
        add(num1);
        add(label);
        add(num2);
        add(button);
        add(num3);
        pack();
        setVisible(true);
        button.addActionListener(new CalculatorLinstener(this));  // 按钮监听事件
    }

    Calculator calculator;
        // 三个文本输入框,一个标签,一个按钮
        TextField num1=new TextField(10); // 字符数
        TextField num2=new TextField(10);
        TextField num3=new TextField(20);
        Label label=new Label("+");
        Button button=new  Button("=");
    }



// 监听器
class CalculatorLinstener implements ActionListener {
    // 组合:获得Calculator 这个类的对象,在一个类中使用到另外一个类的对象,这就是组合。。。 更容易理解什么是面向对象
    Calculator calculator=null;  // 一次性将所有数据拿过来,更方便!
    public CalculatorLinstener(Calculator calculator) {
      this.calculator=calculator;  // 构造器的东西不能被复制?
        /*
        不是的,构造器本质上是一个方法,可以默认调用
        构造器以外的其他函数不被主函数调用的话则不会运行,所以那些方法要写在构造器里面
         */
    }  // 有参构造

    @Override
    public void actionPerformed(ActionEvent e) {
        int n1= Integer.parseInt(calculator.num1.getText());  // 将String 转化为 int
        int n2=Integer.parseInt(calculator.num2.getText());
        calculator.num3.setText(""+(n1+n2));
    }
}


继续优化
使用内部类:最大的好处是,使得内部类可以随时方便地使用外部类的资源

package GUI;

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;


// 优化代码
public class Test09_up {
    public static void main(String[] args) {
        new Calculator();
    }
}

class Calculator extends Frame {

    // 面向对象,分为方法和属性
    public Calculator()  {  // 这些东西要在构造器里面,主函数默认有构造器
        // 布局
        setLayout(new FlowLayout());
        add(num1);
        add(label);
        add(num2);
        add(button);
        add(num3);
        pack();
        setVisible(true);
        button.addActionListener(new CalculatorLinstener());  // 按钮监听事件
    }

    Calculator calculator;
        // 三个文本输入框,一个标签,一个按钮
        TextField num1=new TextField(10); // 字符数
        TextField num2=new TextField(10);
        TextField num3=new TextField(20);
        Label label=new Label("+");
        Button button=new  Button("=");

    // 监听器
    class CalculatorLinstener implements ActionListener {
        // 使用内部类后更加简洁了
        @Override
        public void actionPerformed(ActionEvent e) {
            int n1= Integer.parseInt(num1.getText());  // 将String 转化为 int
            int n2=Integer.parseInt(num2.getText());
            num3.setText(""+(n1+n2));
        }
    }
}