說到面向對象的三大特徵,大家肯定第一時間都會想到:封裝,繼承,多態。想到去年的一次羣面,面試官讓大家談談對面向對象的理解。許多人都把這三大特徵的概念說了一遍。面試官說,結合你自己做過的項目談。我是這樣回答的:
封裝首先封裝是面向對象的第一大特徵,它的概念是將對象的基本屬性和實現細節隱藏起來,僅對外提供公共的訪問方式。在做俄羅斯方塊這個項目時,因爲單個方塊是我們操作的最小單位,所以我們把每個方塊的共同的屬性和方法提取出來成爲一個類,比如說每個方塊都有它對應的行和列(因爲要畫在面板上),每個方塊都有它對應的方法即下落,左移和右移。我們在需要時直接創建它的實例即可。這就是封裝在這個項目中的體現。下邊是部分代碼:
//格子類
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);
}
}
...
多態
多態是面向對象的第三大特徵。多態即事物的多種表現形態。它的意義在於一個類型的引用在指向不同對象時會有不同的實現,而同樣一個對象在造型成不同的類型時也會有不同的功能。在俄羅斯方塊項目中,那七種不同類型的四格方塊就是四格方塊多態性的體現。
總的來說,封裝可以隱藏實現細節,使得代碼模塊化;繼承可以擴展已存在的代碼模塊;多態可以使接口重用。希望能給大家提供點參考。