int main(void)
{
printf("Hello, world!\n");
return 0;
}
后来渐渐明白了,作为彻底实践面向对象设计的编程语言,Java的核心概念是对象,代码的组织单元也是对应的类。在C这样的过程式语言里,代码的基本单元是过程(函数)。C++虽然引入了面向对象的设计,仍然允许以过程的方式组织代码。代码单元的差别意味着在C等过程式语言里,一般的语句(除了声明变量和初始化等)都要写在某个函数里;而在Java里,一般的语句不仅要写在某个函数里,而且每个函数都要位于某个类里(即作为类的方法),并且除了特殊情况使用静态方法,普通的方法都是类被创建的实例上调用的。
事件
面向对象的设计给编程带来很大的便利和好处,在贯彻这种原则的语言中把类作为代码单元似乎也是自然的事情。但是实践中,剥夺了过程的独立生存权有时又会让代码失去过去的灵活和便捷。对事件的编程就是这样的场合。
事件是编程中广泛应用的概念和模式。单击窗体上的某个按钮触发一段代码就是一个简单而典型的例子。从编程的角度说,事件涉及到这样几个范畴:发布者(publisher)、收听者(listener)、事件参数(event argument)和处理程序(event handler)。发布者声明某个名称的事件,收听者登记响应程序;发布者触发事件,将事件的各种信息作为参数传递给处理程序,并执行。发布者、收听者和事件参数都可以对象的形式建模,唯独事件处理程序最直接和自然的形式就是一个函数。在C里,处理程序是一个回调函数;在JavaScript这类函数式语言里,处理程序就是简单的一个函数对象;在汲取了Java在经验和教训而设计的C#里,处理程序仍然是一个函数,只不过以代理包装。但是在一切都是对象的Java里,处理程序无法单独被传递,而是被包装在类——收听者——中,登记到发布者里。
Java里的事件编程
Java的思路是这样的,发布者命名一个事件,包含添加和删除事件处理程序的方法,其参数是某个EventListener的子接口MyEventListener,规定了处理程序的签名,如public void myEventOccurred(Object sender, EventArgs ea);收听者执行该接口,包含处理程序,藉addEventListener之类的方法登记到发布者里;事件触发时,发布者依据该事件对应的收听者的列表,将事件参数传递给收听者实现接口的方法,并运行。