事件机制的简单介绍

 

本文简单介绍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)

内部类:

(注:所有使用内部类的地方都可以不用内部类,使用内部类可以使程序更加的简洁,便于命名规范和划分层次结构)。

内部类是指在一个外部类的内部再定义一个类。

内部类作为外部类的一个成员,并且依附于外部类而存在的。

内部类可为静态,可用PROTECTEDPRIVATE修饰。(而外部类不可以:外部类只能使用PUBLICDEFAULT)。

 

内部类的分类:

成员内部类、

局部内部类、

静态内部类、

匿名内部类(图形是要用到,必须掌握)。

 

① 成员内部类:作为外部类的一个成员存在,与外部类的属性、方法并列。

内部类和外部类的实例变量可以共存。

在内部类中访问实例变量:this.属性

在内部类访问外部类的实例变量:外部类名.this.属性。

 

成员内部类的优点:

内部类作为外部类的成员,可以访问外部类的私有成员或属性。(即使将外部类声明为PRIVATE,但是对于处于其内部的内部类还是可见的。)

用内部类定义在外部类中不可访问的属性。这样就在外部类中实现了比外部类的private还要小的访问权限。

注意:内部类是一个编译时的概念,一旦编译成功,就会成为完全不同的两类。

对于一个名为outer的外部类和其内部定义的名为inner的内部类。编译完成后出现outer.classouter$inner.class两类。

 

成员内部类不可以有静态属性。

 

如果在外部类的外部访问内部类,使用out.inner.

 

建立内部类对象时应注意:

在外部类的内部可以直接使用inner s=new inner();(因为外部类知道inner是哪个类,所以可以生成对象。)

而在外部类的外部,要生成(new)一个内部类对象,需要首先建立一个外部类对象(外部类可用),然后在生成一个内部类对象。

Outer.Inner in=Outer.new.Inner()

错误的定义方式:

Outer.Inner in=new Outer.Inner()

注意:当Outer是一个private类时,外部类对于其外部访问是私有的,所以就无法建立外部类对象,进而也无法建立内部类对象。

 

② 局部内部类:在方法中定义的内部类称为局部内部类。

与局部变量类似,在局部内部类前不加修饰符publicprivate,其范围为定义它的代码块。

 

在类外不可直接生成局部内部类(保证局部内部类对外是不可见的)。

要想使用局部内部类时需要生成对象,对象调用方法,在方法中才能调用其局部内部类。

 

③ 静态内部类:(注意:前三种内部类与变量类似,所以可以对照参考变量)

静态内部类定义在类中,任何方法外,用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.Font;
import java.awt.event.ActionListener;
 
import javax.swing.JButton;
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-->

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值