基础之石——接口、抽象类
本想在类中顺便提一下接口与抽象类这两个概念的,怎料自己偷懒并未将前两篇博文重新整理一番。在说明事件之前,不得不提到接口,有了接口这一概念可以更好的说明抽象类。在这篇博文中,会出现三个概念:接口、抽象类、事件。
在Java中,接口有两种意思:一、指概念性的接口,即能够被外部访问者直接使用的所有方法和属性构成的接口。在上C++课程时,老师所提到的那类接口;二、指用interface关键字定义的实实在在的接口,也称为接口类型。定义了常量值(常量字母一般全都大写)及抽象方法(未定义函数体的方法)。
我们这里所说的接口为第二种意思的接口,虽然接口也是一种类,但是接口无构造方法且无具体实现的方法,无法创建对象。
定义接口:
import java.awt.event.ActionEvent; import java.awt.event.KeyEvent; /** * 定义棋盘的接口类型 * 定义接口的关键字为interface,一个接口不能实现另一个接口,但是可以继承多个接口、不能继承类,这丰富了类的继承 * @author Daily * */ public interface GobangCofig extends java.awt.event.ActionListener,java.awt.event.KeyListener{ // 定义接口的关键字为interface // 定义接口的常量的五种方法 public static final int START_X = 30; // 棋盘起点的横坐标 public final static int START_Y = 50; // 棋盘起点的纵坐标 static final int TRANS_LONG_LINE = 15; // 棋盘横竖线的条数 final static int CHESS_SIZE = 28; //棋子的大小 int SIZE = 30; // 格子的大小 // 定义抽象方法 /** * 横向判断 * @param x 当前放置棋子的坐标 * @param y * @return 计数 */ public abstract int row(int x, int y); /** * 纵向判断 * @param x 当前放置棋子的坐标 * @param y * @return 计数 */ abstract int column(int x, int y); /** * 斜向上判断 * @param x 当前放置棋子的坐标 * @param y * @return 计数 */ public int slant_up(int x, int y); /** * 斜向下计数 * @param x 当前放置棋子的坐标 * @param y * @return 计数 */ int slant_down(int x, int y); }
定义类来实现接口:
import java.awt.event.ActionEvent; import java.awt.event.KeyEvent; /** * 定义绘制五子棋的界面类,继承JFrame并实现GobangConfig接口 * 接口必须通过类来实现它的抽象方法,实现接口的关键字implements,且该类必须实现接口的所有抽象方法 * @author Daily * */ public class GobangUI extends javax.swing.JFrame implements GobangCofig{ /** * 横向判断 * @param x 当前放置棋子的坐标 * @param y * @return 计数 */ public int row(int x, int y){ return 0; } /** * 纵向判断 * @param x 当前放置棋子的坐标 * @param y * @return 计数 */ public int column(int x, int y) { return 0; } /** * 斜向上判断 * @param x 当前放置棋子的坐标 * @param y * @return 计数 */ public int slant_up(int x, int y){ return 0; } /** * 斜向下计数 * @param x 当前放置棋子的坐标 * @param y * @return 计数 */ public int slant_down(int x, int y){ return 0; } /** * Invoked when an action occurs. */ public void actionPerformed(ActionEvent e){ } @Override public void keyTyped(KeyEvent e) { // TODO Auto-generated method stub } @Override public void keyPressed(KeyEvent e) { // TODO Auto-generated method stub } @Override public void keyReleased(KeyEvent e) { // TODO Auto-generated method stub } }
抽象类与接口的相同点:1、都不能被实例化;2、都能包含抽象方法。
抽象类与接口的主要区别:
1、抽象类中可以为部分方法提供默认的实现,而避免了子类重复实现;
2、抽象类具有一般类所具有的构造方法和具体实现的普通方法。
综上而言,抽象类是一般类与接口的集合体,可以自动提供部分方法的实现,但是不能创建对象。
抽象类的定义:(自己还没写过抽象类,因此将MouseAdapter类的源码copy上了,写明相关关键点)
/* * 抽象类的关键字为abstract class * 在抽象类中,我们可以定义属性、构造方法、普通方法、常量、抽象方法 * (我们可以将抽象类看做是:一般类与接口的集合) * @since 1.1 */ public abstract class MouseAdapter implements MouseListener, MouseWheelListener, MouseMotionListener { /** * {@inheritDoc} */ public void mouseClicked(MouseEvent e) {} /** * {@inheritDoc} */ public void mousePressed(MouseEvent e) {} /** * {@inheritDoc} */ public void mouseReleased(MouseEvent e) {} /** * {@inheritDoc} */ public void mouseEntered(MouseEvent e) {} /** * {@inheritDoc} */ public void mouseExited(MouseEvent e) {} /** * {@inheritDoc} * @since 1.6 */ public void mouseWheelMoved(MouseWheelEvent e){} /** * {@inheritDoc} * @since 1.6 */ public void mouseDragged(MouseEvent e){} /** * {@inheritDoc} * @since 1.6 */ public void mouseMoved(MouseEvent e){} }
相关推荐
5. **抽象类与接口的结合**:抽象类可以实现接口,这意味着它可以提供部分或全部接口方法的默认实现,将剩余的实现责任留给其子类。 6. **契约与封装**:接口定义了一个契约,任何实现该接口的类都必须遵循这个契约...
抽象类的主要作用是作为接口,定义派生类必须实现的函数。 5.4 多重继承 多重继承是指一个派生类可以同时从多个基类继承。这在设计时提供了更大的灵活性,但可能导致命名冲突(钻石问题)和复杂性增加。为了解决...
5. 多态:游戏规则可以通过接口或抽象类实现,允许不同的游戏策略。 Kotlin是Google支持的Android开发首选语言,它简化了Java的一些语法,同时保持了面向对象的特性。在Kotlin版本的猜拳游戏中,可以观察到以下特点...
类是模块化和数据抽象的基础,允许程序员创建自定义的类型。在Java中,类是强类型的,编译器执行严格的类型检查,确保类型安全。相比之下,C++的类型检查相对较弱,因为它兼容C语言的类型转换规则。Object Pascal则...
- 类与对象:游戏中的每个元素,如玩家、电脑对手、石头、剪刀、布等,都可以抽象为类,每个实例则为对象。 - 继承:设计时可能采用继承机制,比如创建一个基础的“参与者”类,然后让“玩家”和“电脑”类继承它...
2. `Page.h/cpp`:基础Page类的实现,包含加载和卸载Page的抽象方法,供子类实现。 3. `GeometryPage.h/cpp`:处理具体几何数据的类,实现了LOD切换和对象加载。 4. `pagedGeometry.sln`:Visual Studio解决方案...
1. 封装:这是OOP的基本原则之一,它隐藏了对象内部的实现细节,只对外提供公共接口。通过访问控制修饰符(如public、private、protected),我们可以控制成员变量和函数的可见性,以防止外部代码的不恰当访问。 2....
从基础语法到面向对象的思维,从简单的数据结构到复杂的算法,从代码风格到项目实践,每一个环节都是他们成为优秀Java开发者道路上的铺路石。随着项目学习的不断深入,他们将能够建立起更加全面和立体的知识结构,为...
- **类型分类**: C#中的数据类型分为两大类——值类型和引用类型。 - **值类型**: 包括基本类型如int、float、bool等,以及结构类型。 - **引用类型**: 包括类、接口、数组等。 - **变量**: 用于存储值的容器,每...
----------------------------------- Android 编程基础 1 封面----------------------------------- Android 编程基础 2 开放手机联盟 --Open --Open --Open --Open Handset Handset Handset Handset Alliance ...