基础之石——接口、抽象类
本想在类中顺便提一下接口与抽象类这两个概念的,怎料自己偷懒并未将前两篇博文重新整理一番。在说明事件之前,不得不提到接口,有了接口这一概念可以更好的说明抽象类。在这篇博文中,会出现三个概念:接口、抽象类、事件。
在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){}
}