软件体系结构——基于事件的隐式调用风格

本文介绍了一个基于Java的事件处理机制示例,展示了如何通过按钮点击事件改变窗口中显示的文本。涉及事件源、监听器、事件及事件处理方法等关键概念。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  基于事件的隐式调用风格的基本组件是对象或过程,并分类为以下更小的组件:过程或函数。充当事件源或事件处理器的角色。

连接件是事件-过程绑定。组件可以声明或广播一个或多个事件,或者向系统注册,来表明他希望响应一个或多个事件。当某些事件被触发时,向其注册的过程被隐式调用,调用的次序是不确定的。

程序示例如下:

【功能】:点击窗口程序使显示的文字发生改变。

import java.awt.*;
import java.awt.event.*; //引入java.awt.event包处理事件

class BtnLabelAction extends Frame implements ActionListener {
	// 声明窗口类(BtnLabelAction)并实现动作事件接口(ActionListener)
	Label p;
	Button btn;

	void CreateWindow() { // 自定义方法
		setTitle("MyButton");
		p = new Label("1+1"); // 创建标签对象
		btn = new Button("求和"); // 创建按钮对象
		setLayout(new FlowLayout()); // 布局设计,用于安排按钮、标签的位置
		add(p); // 将标签放入容器
		add(btn); // 将按钮放入容器
		btn.addActionListener(this); // 将监听器(窗体对象本身)注册给按钮对象
		setSize(400, 100);
		setVisible(true);
	}

	public void actionPerformed(ActionEvent e) {// 接口ActionListener的事件处理方法
		if (e.getSource() == btn) // 判断动作事件是否是由按钮btn引发的
			if (p.getText() == "1+1") {
				p.setText("1+1=2");
				btn.setLabel("返回");
			} else {
				p.setText("1+1");
				btn.setLabel("求和");
			}
	}
}
public class BtnTest {
	public static void main(String args[]) {
		BtnLabelAction bla = new BtnLabelAction();
		bla.CreateWindow();
	}
}

组件:注册方法addActionlinster(),处理事件的方法 actionPerformed(),发生的事件ActionEvent e,事件源btn,监听器this(窗体对象本身,实现了Actionlistener接口类的对象)。

连接件:①btn.addActionListener(this);  将事件源按钮对象注册到监听器

②系统定义对事件的处理方法,发生的事件为参数public void actionPerformed(ActionEvent e)

③单击btn触发ActionEvent事件,事件管理器会根据发生的ActionEvent事件,自动调用actionPerformed()方法,执行方法体中的语句。

### Java 中的方法调用顺序 在 Java 编程语言中,方法调用遵循特定的规则和顺序。当涉及到类之间的继承关系时,构造函数的调用顺序尤为重要。 对于带有继承结构的情况,在创建对象实例的过程中: - 创建一个带参数的对象时,程序会寻找子类中对应的带参构造器[^4]。 - 即使在这个过程中没有显写出 `super()` 调用,默认情况下也会存在对父类构造器的调用。 - 的 `super()` 或者程序员手动编写的 `super(...)` 总是在任何其他操作之前被执行,它负责初始化基类部分。 - 接着才是执行当前(派生)类自己的构造逻辑并完成整个对象的构建过程。 下面通过一段简单的代码来展示这种行为: ```java class Parent { public Parent(){ System.out.println("Parent constructor called"); } } public class Child extends Parent{ private final String name; // 子类构造器 public Child(String n){ this.name = n; System.out.println(name + "'s child constructor is invoked."); } public static void main(String[] args) { new Child("Tom"); // 实例化子类对象 } } ``` 上述例子展示了如何在一个具有单层继承体系里发生构造链的过程——先是父级构造被触发打印消息 “Parent constructor called”,随后是子级别特有的处理步骤输出字符串 `"Tom's child constructor is invoked."`。 #### 构造方法之外的一般方法调用 除了构造方法外,普通成员方法按照其定义的位置以及访问修饰符决定可访问性和实际调用路径;而静态上下文中则总是优先考虑同名静态方法而非实例版本[^2]。 Java 支持重载 (overloading),即允许同一个类中有多个名称相同但签名不同的方法共存。这使得开发者可以根据输入参数的不同选择最合适的行为实现[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值