首页 > 其他分享 >09 简易计算器,回顾组合与内部类

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

时间:2023-08-06 13:34:21浏览次数:41  
标签:num2 Calculator 09 简易 add 计算器 new TextField public

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));
        }
    }
}

标签:num2,Calculator,09,简易,add,计算器,new,TextField,public
From: https://www.cnblogs.com/zhanjianhai/p/17609333.html

相关文章

  • C++工厂模式简易实现
    C++工厂模式简易实现引言:动态绑定是面向对象编程的重要功能,但C++目前还没有纳入标准库的反射机制,所以为了更方便的动态构造对象,使得通过配置文件的方式改变派生类对象,而不需要去修改代码,所以可以使用工厂这一常见的设计模式,来完成类对象的动态构造。基于C++11的新特性和模板,实现......
  • msm8909_wk2124_SPI转串口485
    项目使用的是高通的msm8909平台,采用广和通SC806开发板,开发环境采用Ubuntu18.04。SC806默认有两路串口,对项目来说不够使用,需要进行转接,所以采用了wk2124将一路SPI转换为4路串口,然后再加485芯片,转换为4路485接口。接下来详细看看整个配置过程。概述说明:本文档会将为开提供的官方文......
  • P4850 [IOI2009] Raisins 题解
    前言:IOI还出这样水的纯记忆化搜索题?还是T4?真令人难以置信。题意:题目传送门一个N×M的矩阵,对于任意一个子矩阵,只能横着或竖着分割,并且分割一次的价值为改子矩阵的元素之和,现要将该矩阵分割成1×1的方格,求最小的分割总价值之和。思路:看到这是个最优化的题,且数据范围很......
  • 《开放、妥协与灰度》-- 任正非在2009年全球市场工作会议上的讲话 2009年1月15日
    《开放、妥协与灰度》--任正非在2009年全球市场工作会议上的讲话2009年1月15日【导读】任正非从西班牙与葡萄牙看到了海盗精神的退化;从荷兰身上看到了资本至上、过度投机毁掉的帝国繁荣。更重要的是从英国“光荣革命”看到了华为立足世界的思想逻辑,即是,......
  • [代码随想录]Day09-栈与队列part01
    题目:232.用栈实现队列思路:因为go没有栈和队列的类型,直接自己写就行了。比较简单的实现,具体看代码中的注释。代码:typeMyQueuestruct{numbers[]int}funcConstructor()MyQueue{returnMyQueue{numbers:[]int{}}}func(this*MyQueue)Push(xint){......
  • chromedp+goquery简易抓取百度热搜
    安装gogetgithub.com/wms3001/datacrawling抓取百度热搜信息varbnBaiDuHotNewsres:=bn.GetBaiDuHostNews()log.Println(res)......
  • msm8909_Setting中添加永不休眠功能
    项目中需要让Android板开机就进入桌面并且永不休眠。项目使用的是广和通的SC806Android开发板,msm8909平台。配置永不休眠diffdiff文件放前面,可以直接apply进去!diff--gita/frameworks/base/packages/SettingsProvider/res/values/defaults.xmlb/frameworks/base/packages/Se......
  • C语言实现简易版扫雷
     扫雷作为一款内置于windowsXP系统的游戏,相信大多数人都有游玩过。接下来我将带着各位用C语言来实现这个游戏。首先,我们来了解扫雷游戏的规则,将这些规则逐步用函数来实现,再经过逻辑的调整即可得到所需的代码。可以试着先自己玩一把再继续看本文章。扫雷游戏网页版-Minesweeper......
  • 通过docker简易部署es加kibana
    dockerrun-d--nameelasticsearch_7_12-p29200:9200-p29300:9300-v/fp/docker_data/es/config/elasticsearch.yml:/opt/elasticsearch/config/elasticsearch.yml-v/fp/docker_data/es/data:/opt/elasticsearch/data-v/fp/docker_data/es/plugins:/opt/elasticsea......
  • msm8909_MIPI转HDMI调试记录
    项目中需要把开发板的MIPI输出信号转换为HDMI和LVDS输出,使用龙迅的LT8912B进行转换。龙迅的FAE提供的资料相对来说还是比较少的。先简单的看一下吧:厂商资料寄存器配置该文件提供了对LT8912B初始化的寄存器配置。对于我们来说需要做的就是,写一个驱动,在开机的时候调用相关的函数,......