一、抽象类的定义格式
1、概念:包含抽象方法的类叫做抽象类。
2、定义抽象类的关键字:abstract class
格式:
public abstract class抽象类名 extends 抽象类或类{
访问修饰符(public,protected,private)数据类型属性名;
访问修饰符抽象类名(数据类型参数名,…){
//方法体
}
访问修饰符返回值数据类型方法名(数据类型参数名,…){
//方法体
}
访问修饰符 abstract 返回值数据类型方法名(数据类型参数名,…);
//注意:抽象方法没有方法体
}
2、抽象类和类的区别:
1)抽象类可以比类多定义一种抽象方法,而一般的类不能定义抽象方法。
2)抽象类不能实例化对象,而类可以实例化对象。(因为抽象类中可能含有抽象方法,抽象方法是不能被调用的,故实例化抽象类对象也没有意义,故抽象类不能实例化对象。)
3、一般类继承抽象类与抽象类继承抽象类的区别:
一般的类继承抽象类后,必须实现抽象类中所有的抽象方法;
抽象类继承抽象类后,可以不用实现抽象类中所有的抽象方法,只要实现需要的方法即可。
Eg:
public abstract class Student { private String name; //定义构造方法 public Student(String name) { this.name = name; } //定义一般方法 public String getName() { return name; } public void setName(String name) { this.name = name; } //定义抽象方法 public abstract void study();//定义了一个学习的抽象方法study() public abstract void exam();//定义了一个考试的抽象方法exam() } //定义一个一般的类UNStudent继承抽象类Student public class UNStudent extends Student{ public UNStudent(String name) { super(name); } //实现抽象类中所有的抽象方法 @Override public void exam() { setName("张三"); System.out.println(getName()+"在考试。"); } public void study(){ setName("张三"); System.out.println(getName()+"在学习。"); } } //定义一个抽象类ComStudent继承抽象类Student public abstract class ComStudent extends Student{ public ComStudent(String name) { super(name); } //可以选择性的去实现抽象类中的抽象方法 public void study(){ setName("张三"); System.out.println(getName()+"在学习。"); } }
二、接口的定义格式
1、 定义接口的关键字是:interface
格式:
public interface 接口名{
//常量
public static final 常量名 = 值;
//抽象方法
public abstract 返回值数据类型方法名(数据类型参数名,…);
}
接口中默认的访问修饰符是public
2、 接口的实现
关键字:implements
格式:
public class 类名 implements 接口名,…{
}
注意:当类实现接口后,类必须实现接口中的所有抽象方法。接口不能实例化对象。
当继承和实现接口同时存在时,要先继承,再实现接口。
public class 类名 extends 父类名 implement 接口名,...{
//实现接口的抽象方法
}
接口是告诉我们要做什么事情,接口的实现则是告诉我们怎么做这些事情。
接口的实现相当于类中的继承,所以接口的实现中也存在自动转型。
3、 接口和类的区别:
|
接口 |
类 |
1 |
关键字:interface |
关键字:class |
2 |
接口只能定义常量和抽象方法 |
类可以定义任意访问修饰符的方法、属性、常量 |
3 |
接口的默认访问修饰符是public |
类的默认访问修饰符就是默认的(public,protected,private和默认的)。 |
4 |
接口可以实现多重继承 |
类只能实现单继承 |
5 |
接口不能用来实例化对象 |
类可以用来实例化对象 |
Eg:
//定义一个父类Sport:运动类 public class Sport { //定义普通方法jump(),run() public void jump(){ System.out.println("动作:跳跃"); } } //定义了一个接口Dance() public interface Dance { //定义抽象方法gyrate():旋转 public void gyrate(); } //定义一个接口Music(音乐) public interface Music { //定义一个抽象方法play() public void play(); } //定义一个子类Eurythmics(艺术体操类)继承父类Sport,并实现了两个接口Dance,Music,当继承和实现接口同时存在时,要先继承,再实现接口 public class Eurythmics extends Sport implements Dance,Music{ //实现Dance接口中的抽象方法 public void gyrate() { System.out.println("舞蹈动作:旋转"); } //实现Music接口中的抽象方法 public void play() { System.out.println("配乐:天空之城"); } } //定义一个比赛类Match public class Match { public static void main(String[] args) { Eurythmics e=new Eurythmics();//实例化一个艺术体操对象 e.gyrate();//子类实现了Dance接口,子类的对象调用Dance接口中的gyrate()方法 e.play();//子类实现了Music接口,子类的对象调用Music接口中的play()方法 e.jump();//子类继承了父类中的jump()方法,子类的对象调用了jump()方法 System.out.println(); dancePart(e);//e被看作一个Dance对象,相当于e自动转型,作为参数传入dancePart() musicPart(e);//e被看作一个Music对象,相当于e自动转型,作为参数传入musicPart() sportPart(e);//e被看作一个Sport对象,相当于e自动转型,作为参数传入sportPart() } //定义舞蹈部分的方法 public static void dancePart(Dance dance){ dance.gyrate(); } //定义音乐部分的方法 public static void musicPart(Music music){ music.play(); } //定义运动部分的方法 public static void sportPart(Sport sport){ sport.jump(); } }
结果:
舞蹈动作:旋转
配乐:天空之城
动作:跳跃
舞蹈动作:旋转
配乐:天空之城
动作:跳跃
4、使用接口的原因:
1)核心原因:为了能够自动转型为多个基类,这样给程序带来了灵活性。(如上例)
2)将代码完全与接口的实现分离,不同的子类可以对接口中定义的抽象方法有不同的实现,这也是一种规范,在团队合作中,接口可以是分工变得明确,接口确定下来后,就可以同时进行开发,提高开发效率。
3)使用接口还有使用方便,可读性强,结构清晰等优点。
三、 事件原理
1、 事件处理源:
1) 概念Java中所有的组件对象都是可以作为事件源。包括容器和元素组件。
容器布局不是事件源。
2) 如何判断哪个对象是事件源对象?
根据所操作的方法,看操作时反应在哪个组件上,那么该组件就是事件源。
如图:
当用鼠标点击登录按钮的时候,按钮是事件源;当在输入框输入一个账号,按回车时,输入框是事件源;当用鼠标点击“账号”这个标签的时候,标签是事件源;当鼠标点击窗体是,窗体是事件源……
2、 事件类型(监听器方法)
监听器方法:在组件上发生动作后,要捕获动作的方法。
分局发生的动作以及所要使用的值来决定使用不同的事件类型。
常用的事件接口 |
事件类型(监听器方法) |
ActionListener 动作监听器接口 |
AddActionListener(对象名); |
MouseListener 鼠标监听器接口 |
addMouseListener(对象名); |
MouseMotionListener 鼠标移动监听器接口 |
addMouseMotionListener(对象名); |
KeyListener 按键处理监听器接口 |
addKeyListener(对象名); |
3、 事件处理对象
事件处理对象的作用:当监听器方法捕获到动作后,那么就要交给事件处理对象来处理;事件处理对象会实现对应的监听器接口,来完成最后的处理。
4、 事件的执行流程
1) 确定事件源对象
2) 确定要发生的是什么类型的事件
3) 给事件源添加监听器方法
4) 实例化事件处理类的对象(定义类实现事件接口,并且实现接口中的方法)
5) 给监听器方法绑定事件处理类对象
只要事件源发生监听器方法能捕获到的动作,那么方法就会捕获动作信息以及事件源的相关信息,然后激活事件处理对象,将收集的信息和动作一并交给事件处理对象,事件处理对象会根据信息自动调用事件处理方法。
Eg1:实现QQ登录界面登录的过程,做账号和密码验证。
QQ界面上的关键代码如下:
JButton jb=new JButton("登 录"); jp2.add(jb); //jcb为下拉框对象,jpf为密码输入框对象,jf为登录窗口对象 LoginListener ll=new LoginListener(jcb,jpf,jf); jb.addActionListener(ll);
定义事件处理类:
//定义LoginListener类实现了事件接口ActionListener public class LoginListener implements ActionListener { private JComboBox jcb; private JPasswordField jpf; private JFrame jf1; //定义构造方法,便于在实例化事件处理类对象时,将qq界面上将下拉框、密码输入框、登录窗口的对象的地址传过来,进行事件处理 public LoginListener(JComboBox jcb,JPasswordField jpf,JFrame jf1){ this.jcb=jcb; this.jpf=jpf; this.jf1=jf1; } /** * 事件处理方法 */ public void actionPerformed(ActionEvent arg0) { String jcbStr=(String)jcb.getSelectedItem();//获取下拉列表中选中项,并把其转成String类型 String jpfStr=new String(jpf.getPassword()); //当账号和密码匹配时,出现新的QQ界面(窗口),同时登录窗口关闭 if(jcbStr.equals("12345678")&&jpfStr.equals("123")){ JFrame jf=new JFrame("QQ2013"); jf.setSize(260,600); jf.setResizable(true); jf.setLocationRelativeTo(null); jf.setDefaultCloseOperation(3); jf.setVisible(true); jf1.setVisible(false);//将登录窗口隐藏起来 }else{ //当账号和密码不匹配时,弹出提示信息 JOptionPane.showMessageDialog(null, "请输入正确的账号和密码!"); } } }
1、点击“登录”按钮后,事件发生,事件源为“登录”按钮。
2、即将发生的事件为:当账号和密码匹配时,出现新的QQ界面(窗口),同时登录窗口关闭;当账号和密码不匹配时,弹出提示信息。
3、添加监听器方法addActionListener()
4、定义LoginListener类实现了事件接口ActionListener,实例化事件处理类的对象ll。
5、给监听器绑定事件处理对象ll。
相关推荐
异步调用是一种类似消息或事件的机制解决了同步阻塞的问题,例如A通知B后,他们各走各的路,互不影响,不用像同步调用那样,A通知B后,非得等到B走完后,A才继续走。回调是一种双向的调用模式,也是说,被调用的接口...
17.2 安全机制程序示例 509 17.2.1 列举进程访问令牌内容和权限 509 17.2.2 修改进程的权限 514 17.2.3 列举安全对象的安全描述符 515 17.2.4 修改安全描述符 521 17.3 用户 522 17.3.1 ...
字节大佬总结的Java面试资料 JVM 是可运行 Java 代码的假想计算机 ,包括一套字节码指令集、一组寄存器、一个栈、 一个垃圾回收,堆 和 一个存储方法域。JVM 是运行在操作系统之上的,它与硬件没有直接 的交互。 ...
近做项目,使用的是三层架构,在创建数据访问层接口的时候,使用的是反射和缓存机制,但是在运行的时候,总是提示不成功,测试发现反射机制出现问题,没有生成反射对应的类,加载失败,和别人写的代码进行对比,发现...
Windows API(Windows Application Program Interface,Windows应用程序接口)是一系列函数、宏、数据类型、数据结构的集合,运行于Windows系统的应用程序,可以使用操作系统...第3部分(第18章)作为全书的总结和补充。
17.2 安全机制程序示例 509 17.2.1 列举进程访问令牌内容和权限 509 17.2.2 修改进程的权限 514 17.2.3 列举安全对象的安全描述符 515 17.2.4 修改安全描述符 521 17.3 用户 522 17.3.1 创建用户 522 ...
文章目录Java ReflectionJava反射机制提供的功能Java反射相关的主要APIjava.lang.Class类Class类的核心要点Class类的重要API实例实例化Class类对象(四种方法)创建类对象并获取类的完整结构获取Class对象后创建类的...
《精通WindowsAPI:函数、接口、编程实例》全书共18章,分为...第3部分(第18章)作为全书的总结和补充。 从Windows应用程序开发工具讲起,引导读者快速入门 详细讲解API和关键结构的使用方法 提供156个WindowsAPI使用实例
RIP的防环机制:1、水平分割:A、水平分割:从接口收到的路由信息,不再从本接口发出。 B、毒性逆转的水平分割:从本接口收到的路由信息,转发 表示为16跳不可达。(防路由和IP包的环路) 2、最大...
Android工作实践总结:...AIDL的IPC的机制和COM或CORBA类似, 是基于接口的,但它是轻量级的。它使用代理类在客户端和实现层间传递值. 如果要使用AIDL, 需要完成2件事情: 1. 引入AIDL的相关类.; 2. 调用aidl产生的class.
2 Vivado HLS的工作机制 5 3-4 HLS设计流程基本概念 9 5 任意精度数据类型 15 5.1 C语言支持的数据类型 15 5.2 sizeof()函数使用 16 5.3 设置Visual Studio支持任意精度数据类型 17 6 数组类型转换 17 6.1 变量的...
vs2015环境能跑,具有一定C#基础,需要深入理解语言逻辑机制的同志有一定参考价值,代码中有详细注释,具体见https://blog.csdn.net/coolzpf/article/details/117223856
MTK 短信的发送机制,同事总结出来的,很实用的文档
Windows API(Windows Application ProgramInterface,Windows应用程序接口)是一系列函数、宏、数据类型、数据结构的集合,运行于Windows系统的应用程序,可以使用操作系统提供...第3部分(第18章)作为全书的总结和补充。
3.2.3 Java反射机制的相关API java.lang.reflect包提供了用于获取类和对象的反射信息的类和接口。反射API允许对程序访问有关加载类的字段,方法和构造函数的信息进行编程访问。它允许在安全限制内使用反射的字段,...
《精通WindowsAPI:函数、接口、编程实例》全书共18章,分为...第3部分(第18章)作为全书的总结和补充。 从Windows应用程序开发工具讲起,引导读者快速入门 详细讲解API和关键结构的使用方法 提供156个WindowsAPI使用实例
之前写过一篇Android事件分发机制详解,感觉比较乱,这里再总结一下。网上已经有很多前辈分析过源码,大家可以参考,我这里尽量不做过多的源码分析,仅仅从流程上分析。事件分发和消费我们主要涉及到以下三个方法:...
Python爬虫开发中常见问题及其解决方法和经验总结主要包括以下几点: 网络请求问题 请求失败或超时:设置合理的超时时间,并使用异常处理机制(如try-except),当出现requests.exceptions.Timeout异常时进行重试...
13.2.1 事件和事件类型 13.2.2 事件的绑定 13.2.3 直接调用事件处理函数 13.2.4 事件处理函数的返回值 13.2.5 带参数的事件响应及其例子 13.2.6 “this”关键字 13.3 标准事件模型 ...