本人有C语言基础,通过阅读Java廖雪峰网站,简单速成了java,但对其中一些入门概念有所疏漏,阅读本书以弥补。
第一章 Java入门
第二章 面向对象
第三章 变量
第四章 方法操作实例变量
第五章 程序实战
第六章 Java函数库
第七章 继承与多态
第八章 深入多态
第九章 构造器与垃圾收集器
第十章 数字与静态
第十一章 异常处理
第十二章 图形用户接口 GUI
这一章承接上一章,继续设计音乐播放器。但GUI并不是我学习Java的重点,这里只简单介绍相关概念了~有兴趣的朋友,可以阅读本书第十二章。
JFrame——window对象
组件
ActionEvent 事件,按钮是其来源
.addActionListener(ActionListener) 向按钮注册,调用该方法的就是按钮
ActionListener 监听接口,必须实现actionPeformed()
ActionEvent 只是携带数据的载体
事件源会在用户操作时产生事件(比如:用户按下按钮,按钮是事件源)
想要获得按钮的事件,必须有监听接口监听对应事件。而我们编写代码主要就是写这一块,以及监听到后的处理。
实现对应事件监听接口——就是写好继承通用监听接口的类~
对按钮注册——即告知按钮,我会监听某某事件
定义事件处理方法——当按钮触发,接口就会听到,并执行该方法
还记得第七八章吗,接口是一个纯抽象类,继承它必须实现其方法!
这里讲的很粗糙,主要只介绍了后续内部类需要的铺垫,因为内容是基于GUI设计程序写的,不过多关注,这里大家不舒服可以看看原书P357-362.
内部类可以存取外部类的方法与实例变量(包括私private)
内部类的实例存取外部类实例的内容——只能存取他所属的
非常特殊的异常情况:内部类定义在静态方法中。大家可以思考以及搜索一下~
内部对象(实例)会绑在 执行 初始化内部类的代码(方法)的对象(实例)上。
对象就是指类模板创建的一个实例~,这里简单回顾一下。
class Outer {
private int x;
//Inner inner = new Inner(); 创建外部类对象时,直接初始化也可以~
public void InitInner() {
Inner inner = new Inner();
}
class Inner {
void go() {
x = 42;
}
}
回到实现按钮程序,如下图,更好体会内部类的意义。
P373~374提出三种方法,但都不如内部类
实现两个Peform,不合理!不能在同一个类中实现一个方法两次。
两个按钮注册同一个监听口,不够面向对象。因为进行Pefrom需要查询事件源,后续增加或者改变维护不方便
创建不同的监听口。不行,存取不到Mygui上的变量~
内部类——提供在一个类中实现同一接口的多次机会。
一般的类,不能实现同一个方法两次(执行内容不同)!
但使用内部类,就可以不同的方式实现同一的接口的某个方法
思考——内部类就是用来实现这种 按钮事件处理程序 吗?(非常重要的思考)
为什么不直接实现独立的类?
——需要多次实现同一个接口!
——两个不同的类表示两种事物,这才是面向对象!
内部类无法重用,何必这样?
——IS-A与多态思想!外部与内部类需要通过不同的IS-A测试!
——我们知道注册方法必须是ActionListener类,但如果某类已经继承了其他类怎么办?
——类可以继承多个接口,但只能有一个父类。那内部类的意义到底体现在哪?体现在IS-A测试与多态
——举个例子,某类不能既是Dog又是监听接口(不合理对吧),但有时必须这样(甲方非要好几个狗按钮的监听接口?),那么内部类就有作用了。
即 Dog继承Animal,Dog IS-A 动物,但Dog IS-not 监听接口;这时通过内部类代表监听接口。多个内部类 IS-A 监听接口,这样我们通过了IS-A测试,且对监听接口(ActionListener类)也实现了多次!方便方法(addActionListener)传参数时以多态形式传入