本文简单介绍Java接口,抽象类,内部类还有事件机制。
1.接口(interface),接口被用来建立类与类之间关联的标准。
Java codepublic interface ITest{
public void test();
}
public cl ass TestImpl implements ITest{
public void test(){
System.out.println("test");
}
}
2.抽象类(abstract class),只要类中有一个抽象方法,此类就被标记为抽象类。实际上抽象类除了被继承之外没有任何意义。
区别
1.
接口是公开(public)的,里面不能有私有的方法或变量,是用于让别人使用的,实现接口的一定要实现接口里定义的所有方法。
而抽象类是可以有私有方法或私有变量的,实现抽象类可以有选择地重写需要用到的方法,但是必须实现里面所有的抽象方法。
2.
抽象类在 Java 语言中表示的是一种继承关系,一个类只能使用一次继承关系。
但是,一个类却可以实现多个interface(java中实现多重继承的方法之一)。
3.
抽象类中可以有自己的数据成员,也可以有非abstarct的成员方法。
而在接口中,只能够有静态的不能被修改的数据成员(也就是必须是 static final的,不过在 interface中一般不定义数据成员),而且所有的成员方法都是抽象的。
4.
抽象类和接口所反映出的 设计理念不同。
其实abstract class表示的是"is-a"关系,interface表示的是"like-a"关系。(组合是"has a"关系)
5.
接口中定义的变量默认是public static final 型,且必须给其初值,所以实现类中不能重新定义,也不能改变其值。
抽象类中的变量默认是 friendly 型,其值可以在子类中重新定义,也可以重新赋值。
一般的应用里,最顶级的是接口,然后是抽象类实现接口,最后才到具体类实现。不是很建议具体类直接实现接口的。还有一种设计模式是面向接口 编程,而非面向实现编程。
其实接口是抽象类的延伸,可以将它看做是纯粹的抽象类,就是说接口比抽象类还抽象,还有设计接口的目的就是为了实现C++中的多重继承,不过java团队设计的一样更有趣的东西来实现这个功能,那就是内部类(inner class)。
内部类:
(注:所有使用内部类的地方都可以不用内部类,使用内部类可以使程序更加的简洁,便于命名规范和划分层次结构)。
内部类是指在一个外部类的内部再定义一个类。
内部类作为外部类的一个成员,并且依附于外部类而存在的。
内部类可为静态,可用PROTECTED和PRIVATE修饰。(而外部类不可以:外部类只能使用PUBLIC和DEFAULT)。
内部类的分类:
成员内部类、
局部内部类、
静态内部类、
匿名内部类(图形是要用到,必须掌握)。
① 成员内部类:作为外部类的一个成员存在,与外部类的属性、方法并列。
内部类和外部类的实例变量可以共存。
在内部类中访问实例变量:this.属性
在内部类访问外部类的实例变量:外部类名.this.属性。
成员内部类的优点:
⑴内部类作为外部类的成员,可以访问外部类的私有成员或属性。(即使将外部类声明为PRIVATE,但是对于处于其内部的内部类还是可见的。)
⑵用内部类定义在外部类中不可访问的属性。这样就在外部类中实现了比外部类的private还要小的访问权限。
注意:内部类是一个编译时的概念,一旦编译成功,就会成为完全不同的两类。
对于一个名为outer的外部类和其内部定义的名为inner的内部类。编译完成后出现outer.class和outer$inner.class两类。
成员内部类不可以有静态属性。
如果在外部类的外部访问内部类,使用out.inner.
建立内部类对象时应注意:
在外部类的内部可以直接使用inner s=new inner();(因为外部类知道inner是哪个类,所以可以生成对象。)
而在外部类的外部,要生成(new)一个内部类对象,需要首先建立一个外部类对象(外部类可用),然后在生成一个内部类对象。
Outer.Inner in=Outer.new.Inner()。
错误的定义方式:
Outer.Inner in=new Outer.Inner()。
注意:当Outer是一个private类时,外部类对于其外部访问是私有的,所以就无法建立外部类对象,进而也无法建立内部类对象。
② 局部内部类:在方法中定义的内部类称为局部内部类。
与局部变量类似,在局部内部类前不加修饰符public和private,其范围为定义它的代码块。
在类外不可直接生成局部内部类(保证局部内部类对外是不可见的)。
要想使用局部内部类时需要生成对象,对象调用方法,在方法中才能调用其局部内部类。
③ 静态内部类:(注意:前三种内部类与变量类似,所以可以对照参考变量)
静态内部类定义在类中,任何方法外,用static定义。
静态内部类只能访问外部类的静态成员。
生成(new)一个静态内部类不需要外部类成员:这是静态内部类和成员内部类的区别。静态内部类的对象可以直接生成:
Outer.Inner in=new Outer.Inner();
而不需要通过生成外部类对象来生成。这样实际上使静态内部类成为了一个顶级类。
静态内部类不可用private来进行定义。例子:
对于两个类,拥有相同的方法:
People
{
run();
}
Machine{
run();
}
此时有一个robot类:
class Robot extends People implement Machine.
此时run()不可直接实现。
注意:当类与接口(或者是接口与接口)发生方法命名冲突的时候,此时必须使用内部类来实现。
用接口不能完全地实现多继承,用接口配合内部类才能实现真正的多继承。
④ 匿名内部类:
匿名内部类是一种特殊的局部内部类,它是通过匿名类实现接口。
IA被定义为接口。
IA I=new IA(){};
注:一个匿名内部类一定是在new的后面,用其隐含实现一个接口或实现一个类,没有类名,根据多态,我们使用其父类名。
因其为局部内部类,那么局部内部类的所有限制都对其生效。
匿名内部类是唯一一种无构造方法类。
匿名内部类在编译的时候由系统自动起名Out$1.class。
事件模型指的是对象之间进行通信的设计模式。
对象1给对象2发送一个信息相当于对象1引用对象2的方法。
模型即是一种设计模式(约定俗成)
对象对为三种:
①事件源:发出事件者;
②事件对象:发出的事件本身;
① 事件监听器:提供处理事件指定的方法。
Java AWT事件模型也称为授权事件模型,指事件可以和监听器之间事先建立一种关系:约定那些事件如何处理,由谁去进行处理。这种约定称为授权。
一个事件源可以授权多个监听者(授权也称为监听者的注册);
多个事件源也可以注册多个事件监听器。
监听者对于事件源的发出的事件作出响应。
在java.util中有EventListener接口:所有事件监听者都要实现这个接口。
java.util中有EventObject类:所有的事件都为其子类。
事件范例在\CoreJava\Girl.java文件中。(文件已加注释)
注意:接口因对不同的事件监听器对其处理可能不同,所以只能建立监听的功能,而无法实现处理。
下面程序建立监听功能:
//监听器接口要定义监听器所具备的功能,定义方法
{
void WhatIdoWhenGirlHappy(EmotionEvent e);
void WhatIdoWhenGirlSad(EmotionEvent e);
}
注意查看参考书:事件的设置模式,如何实现授权模型。
事件模式的实现步骤:
开发事件对象(事件发送者)——接口——接口实现类——设置监听对象
一定要理解透彻Gril.java程序。
重点:学会处理对一个事件源有多个事件的监听器(在发送消息时监听器收到消息的排名不分先后)。
事件监听的响应顺序是不分先后的,不是谁先注册谁就先响应。
事件监听由两个部分组成(接口和接口的实现类)。
事件源 事件对象 事件监听
gril EmotinEvent EmotionListener(接口)、Boy(接口的实现类)
鼠标事件:MouseEvent,接口:MouseListener。
P235 ActionEvent。
注意在写程序的时候:import java.awt.*;以及import java.awt.event.*注意两者的不同。
在生成一个窗体的时候,点击窗体的右上角关闭按钮激发窗体事件的方法:窗体Frame为事件源,WindowsListener接口调用Windowsclosing()。
为了配合后面的实现,我们必须将WindowsListener所有的方法都实现,除了Windowsclosing方法,其余的方法均为空实现。
QQ登陆帐户和密码的验证<!--StartFragment -->
import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JFrame; import javax.swing.JOptionPane; import javax.swing.JTextField; public class QQListener implements ActionListener { //扩大参数的访问范围 private JTextField jteName, passWord; private JFrame ff; /** * 构造方法,接受账号和密码输入框对象 * @param login * @param jteName */ public QQListener(JTextField jteName ,JTextField passWord) { this.jteName=jteName; this.passWord=passWord; } /** * 4.实现事件处理方法。 */ public void actionPerformed(ActionEvent e) { //System.out.println("你点击了"+e.getActionCommand()+"按钮!"); //获取输入的账号和密码 String name=(String)jteName.getText(); String pwd = (String)passWord.getText(); //判断输入账号和密码是否是admin if(name.equals("admin") && pwd.equals("admin")){ // 实例化一个JFrame类的对象 JFrame jf = new JFrame(); // 3.设置窗体的属性值 jf.setTitle("QQ");// 设置标题 jf.setSize(380, 290);// 设置大小 jf.setLocation(100, 100);//设置窗体显示在屏幕100,100的位置 jf.setLocationRelativeTo(null);// 设置窗体显示在屏幕中央 jf.setResizable(false);// 设置禁止改变窗体大小 jf.setDefaultCloseOperation(3);// 设置窗体关闭时退出程序 ff.dispose();//登录窗口关闭 }else{ //弹出一个消息提示框 JOptionPane.showMessageDialog(ff, "你输入账号和密码错误,请重新输入!"); } } }计算器的加减乘除的实现
package cal4;
import java.awt.Dimension;
import javax.swing.JFrame; import javax.swing.JMenu; import javax.swing.JMenuBar; import javax.swing.JMenuItem; import javax.swing.JPanel; import java.awt.BorderLayout;
import java.awt.event.ActionListener;
import javax.swing.JTextField;
/**import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.Font;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JTextField;
*
* @author 123
*
*/
public class Clacul {
/**
* 主函数入口
*/
JTextField jte = new JTextField();
ClaculListener al=new ClaculListener(jte);
public static void main(String [] args)
{
//实例化一个对象
Clacul cal = new Clacul();
cal.UIinit();
}
//UI的方法
public void UIinit ()
{
// 创建一个窗体对象
JFrame jf = new JFrame();
// 设置窗体的属性值
jf.setTitle("计算器");
jf.setSize(new Dimension(280, 400));
jf.setLocationRelativeTo(null);
jf.setDefaultCloseOperation(3);
jf.setResizable(false);
// 调用创建菜单栏的方法
JMenuBar jmb = createMenuBar();
// 设置窗体的菜单栏对象为jmb
jf.setJMenuBar(jmb);
// 调用创建北边面板的方法
JPanel north = createNorthPanel();
jf.add(north, BorderLayout.NORTH);
// 调用创建东边面板的方法
JPanel center = createCenterPanel();
jf.add(center, BorderLayout.CENTER);
jf.setVisible(true);
}
public JPanel createNorthPanel() {
JPanel panel = new JPanel();
// 设置大小
jte.setPreferredSize(new Dimension(240, 65));
// 设置禁止编辑
jte.setEditable(false);
// 设置文本框中内容从右到左显示
jte.setHorizontalAlignment(JTextField.RIGHT);
jte.setText("0");// 设置默认值
// 设置文本框中字体的样式
jte.setFont(new Font("宋体", Font.BOLD, 30));
panel.add(jte);
return panel;
// TODO Auto-generated method stub
}
public JPanel createCenterPanel() {
JPanel panel = new JPanel();
// 设置panel的大小
panel.setPreferredSize(new Dimension(0,227));
String[] array ={"0","1","2","3","4","5","6","7","8","9","+","-","*","/","C","="};
// 遍历数组
for (int i = 0; i < array.length; i++)
{
//实例化一个JtextField类的对象
// 实例化一个JButton类的对象
JButton jbu1 = new JButton(array[i]);
jbu1.addActionListener(al);
//array[].addActionLisrener(this);
//判断是否是等号按钮
if(array[i].equals("=")){
//设置大小
jbu1.setPreferredSize(new Dimension(74, 33));
}else{
//设置大小
jbu1.setPreferredSize(new Dimension(43, 33));
}
//添加到面板上
panel.add(jbu1);
}
return panel;
} // TODO Auto-generated method stub
// TODO Auto-generated method stub
public JMenuBar createMenuBar() {
// 实例化一个JMenuBar的对象
JMenuBar jmb = new JMenuBar();
// 定义一个一维数组
String[] arrayMenu = { "查看", "编辑", "帮助" };
// 定义一个二维数组
String[][] arrayItem = { { "标准型","科学型" }, { "复制", "粘贴", "历史记录" },
{ "查看帮助", "关于计算器" } };
// 循环便利arrayMenu数组
for (int i = 0; i < arrayMenu.length; i++) {
// 创建JMenu对象
JMenu menu = new JMenu(arrayMenu[i]);
// 将menu添加到jmb上
jmb.add(menu);
// 循环便利arrayItem数组
for (int j = 0; j < arrayItem[i].length; j++) {
// 创建JMenuItem对象
JMenuItem item = new JMenuItem(arrayItem[i][j]);
// 将item添加到menu上
menu.add(item);
}
}
return jmb;
// TODO Auto-generated method stub
}
}
// 调用创建北边面板的方法
package cal4; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import javax.swing.JButton; import javax.swing.JTextField; public class ClaculListener implements ActionListener { private double n=0; private float m1=0,m2=0; private int flag=0; private JTextField jte ; public ClaculListener(JTextField t1) { this.jte=t1; } public void actionPerformed(ActionEvent e) { String[] array ={"0","1","2","3","4","5","6","7","8","9","+","-","*","/","C","="}; String str=""; for(int i=1;i<=9;i++){ // 显示输入的数据的过程及结果 if(e.getActionCommand().equals(array[i])){ n=n*10+i; str=String.valueOf(n); jte.setText(str); jte.getText(); } } for(int i=10;i<=13;i++) if(e.getActionCommand().equals(array[i])){ //依次寻找与所事件匹配的的运算符是那种 m1=Float.parseFloat(jte.getText()); if(flag==10) m2=m1+m2; //如果连续2次或以上点击运算符而没有按“C”或“=”键,则计算//并保存到m2 else if(flag==11) m2=m2-m1; else if(flag==12) m2=m2*m1; else if(flag==13) m2=m2/m1; else m2=m1; // 如果没有连续的运算符运算,就保存当前数据到m2 if(i==10) flag=10; // 记录运算符 else if(i==11) flag=11; else if(i==12) flag=12; else flag=13; str=String.valueOf(m2); jte.setText(str); //显示连续的运算过程 n=0; // n还原0,记录下次输入数据 break; // 如果找到了匹配的运算符并完成运算和记录就退出寻找过程 } if(e.getActionCommand().equals(array[15])){ //如果事件是"=" m1=Float.parseFloat(jte.getText()); if(flag==10) m2=m1+m2; //判断运算符,并作计算,显示运算结果 else if(flag==11) m2=m2-m1; else if(flag==12) m2=m2*m1; else if(flag==13) m2=m2/m1; str=String.valueOf(m2); jte.setText(str); // 显示运算结果 n=0; // n还原0,记录下次输入数据 flag=0; // flag还原0,表明没有未处理的运算符 jte.getText(); } if(e.getActionCommand().equals(array[14])){ //如果事件是"C"即作清楚,各变量还原0 m1=0; m2=0; flag=0; n=0; jte.setText("0"); } } }
<!--EndFragment-->
相关推荐
下面将详细介绍Java事件处理机制以及如何处理鼠标和键盘事件,以及事件适配器的使用。 1. **事件源(Event Source)**: 在Java事件处理中,事件源是能够生成事件的对象,例如按钮、文本框等组件。这些组件通过...
通过本篇文章的详细介绍,我们对Android事件分发机制有了更深刻的理解。掌握了事件分发的基本原理后,开发者可以根据实际需求灵活地控制事件的流向,从而优化应用的交互体验。希望本文能够帮助广大Android开发者更好...
本文将详细介绍如何在C++中实现一个简单的事件机制。 ##### 1. 事件 在面向对象编程中,“事件”通常指的是对象的状态或属性发生变化,或者是对象接收到某些动作时,该对象会向外发出通知。例如,在图形用户界面...
windows消息机制简单介绍,对消息过程的简单介绍和解释
本文将详细介绍在VC++中如何使用事件来实现线程同步。 ### 一、线程基础 在Windows 95及后续操作系统中,应用程序是基于多任务、多线程环境运行的。一个进程可以包含多个并发的线程,每个线程都有其独立的执行流。...
Android事件处理基于一个简单的模型:当用户与屏幕上的UI元素交互时,系统会产生事件(如点击、滑动等)。这些事件首先被最上层的视图捕获,然后通过事件分发链逐级向下传递。 2. **事件分发流程** 事件分发主要...
### Java事件处理机制详解 #### 一、事件处理机制概览 ...通过以上的介绍可以看出,Java的事件处理机制提供了一种强大且灵活的方式来响应用户的输入,使得开发者能够轻松地构建出具有丰富交互功能的GUI应用程序。
通过简单的案例,我们可以更加清晰地理解事件冒泡机制的工作原理。假设在页面中有一个嵌套的结构:div1包含div2,div2包含span。我们为body元素添加了一个点击事件监听器。当用户点击span、div2、div1甚至body本身时...
Android系统中的广播(Broadcast)机制是一种关键的组件间通信方式,允许应用的不同部分即使在不同进程中也能相互通信。广播通常通过Intent对象来传递信息,Intent不仅可以在同一个应用内部使用,也可以跨应用发送,...
本文将通过一个简单的C#控制台程序来介绍.NET中的事件机制。 #### 代码分析 首先,我们来看一下这段代码的关键部分: ```csharp using System; namespace EVENT___ { class Program { static void Main...
本文将详细介绍Java中事件监听器的四种实现方式:自身类作为事件监听器、外部类作为事件监听器、匿名内部类作为事件监听器以及内部类作为事件监听器。 #### 一、自身类作为事件监听器 自身类作为事件监听器是最...
OSAL这样一个事件驱动的多任务的资源分配机制做了一个简明扼要的介绍,希望对大家有所帮助。OSAL(OperatingSystemAbstractionLayer),翻译为“操作系统抽象层”。 OSAL就是一种支持多任务运行的系统资源分配机制。...
### pb各个事件ID简单说明 在用户界面设计与开发领域,事件处理机制是十分关键的一环,它确保了用户交互的流畅性和应用的响应性。本文将基于提供的标题、描述和部分上下文内容,详细解释几个重要的用户自定义事件ID...
在Flex应用开发过程中,事件处理机制是非常重要的一个环节,而自定义事件则是这一机制中的高级特性之一。下面将详细介绍Flex自定义事件的相关知识点。 #### 1. 自定义事件的意义 在Flex应用中,事件是一种对象,...
通过以上介绍,我们可以看到ZK框架提供了丰富的事件处理机制,以及对MVC模式和数据绑定的支持,这些功能使得开发者能够构建出高度互动、易于维护的Web应用程序。无论是对于新手还是经验丰富的开发者来说,掌握这些...
本文将简要介绍其中的核心模块、关键机制和主要类。 首先,`QtCore`模块是Qt的核心,它提供了许多关键机制: 1. **元对象系统(Meta-Object System)**:这是Qt的基石,它通过元数据增强了C++,允许在运行时动态...
本篇将详细介绍如何基于广播事件机制实现一个简单的定时提醒功能。 首先,让我们深入理解Android的广播事件机制。广播事件在Android中是一种全局的通知方式,它通过Intent对象传播消息。当一个广播发送出去,所有...
总结起来,C#的事件机制提供了一种安全、封装的通信方式,使得类可以广播特定的事件而无需直接引用其他类。在实际开发中,事件广泛应用于用户界面、多线程通信等多个场景。通过理解和熟练运用事件,可以构建更灵活、...
在QT中,事件机制是基于C++的面向对象设计,通过消息队列和事件循环来实现。以下是对QT事件使用的详细介绍: 1. **事件模型**:QT采用发布/订阅模式来处理事件。事件源(如鼠标、键盘或系统)发布事件,然后事件...
文件名`eventhandledemo`可能包含一个示例程序,演示了如何使用继承和虚函数构建一个简单的事件处理框架。 总的来说,理解并熟练运用继承和虚函数以及事件注册与调度机制对于开发高效、可扩展的C++程序至关重要。...