说到面向对象的三大特征,大家肯定第一时间都会想到:封装,继承,多态。想到去年的一次群面,面试官让大家谈谈对面向对象的理解。许多人都把这三大特征的概念说了一遍。面试官说,结合你自己做过的项目谈。我是这样回答的:
封装首先封装是面向对象的第一大特征,它的概念是将对象的基本属性和实现细节隐藏起来,仅对外提供公共的访问方式。在做俄罗斯方块这个项目时,因为单个方块是我们操作的最小单位,所以我们把每个方块的共同的属性和方法提取出来成为一个类,比如说每个方块都有它对应的行和列(因为要画在面板上),每个方块都有它对应的方法即下落,左移和右移。我们在需要时直接创建它的实例即可。这就是封装在这个项目中的体现。下边是部分代码:
//格子类
public class Cell {
private int row;
private int col;
private BufferedImage image;//贴图
...
//左移
public void moveleft(){
col--;
}
//右移
public void moveright(){
col++;
}
//下落
public void drop(){
row++;
}
}
继承
继承是面向对象的第二大特征。它的意义在于我们可以在一个类的基础上开发另一个类,新开发的类不仅可以拥有原来类的所有功能而且可以添加自己的功能。在俄罗斯方块项目中,有七种类型的四格方块,它们都继承自四格方块类,即都有四个格子,都有左移,右移,下落的功能。但它们每种格子的形状和旋转方式都是不同的。这就是项目中继承的体现。以下是部分代码:
//四格方块
public class Tetromino {
//留给子类使用的属性cells
protected Cell[] cells=new Cell[4];
//工厂方法,用于随机产生七种类型方块
public static Tetromino randomOne(){
Random random=new Random();
int type=random.nextInt(7);
switch(type){
case 0:return new T();
case 1:return new I();
case 2:return new L();
case 3:return new J();
case 4:return new S();
case 5:return new Z();
case 6:return new O();
}
return null;
}
public void moveRight(){
for(int i=0;i<cells.length;i++){
cells[i].moveright();
}
}
public void moveLeft(){
for(int i=0;i<cells.length;i++){
cells[i].moveleft();}
}
public void softDrop(){
for(int i=0;i<cells.length;i++){
cells[i].drop();}
}
}
class T extends Tetromino{
public T(){
cells[0]=new Cell(0,4,Tetris.T);
cells[1]=new Cell(0,3,Tetris.T);
cells[2]=new Cell(0,5,Tetris.T);
cells[3]=new Cell(1,4,Tetris.T);
states=new State[4];
states[0] = new State(0,0, 0,-1, 0,1, 1,0);
states[1] = new State(0,0, -1,0, 1,0, 0,-1);
states[2] = new State(0,0, 0,1, 0,-1, -1,0);
states[3] = new State(0,0, 1,0, -1,0, 0,1);
}
}
...
多态
多态是面向对象的第三大特征。多态即事物的多种表现形态。它的意义在于一个类型的引用在指向不同对象时会有不同的实现,而同样一个对象在造型成不同的类型时也会有不同的功能。在俄罗斯方块项目中,那七种不同类型的四格方块就是四格方块多态性的体现。
总的来说,封装可以隐藏实现细节,使得代码模块化;继承可以扩展已存在的代码模块;多态可以使接口重用。希望能给大家提供点参考。