面向对象,封装数据,减少代码重复;一个完整的软件是不是也是一个类引用出来的对象?JVM运行时进入main方法中,这个时候main方法所在的类也是一个对象的模板?疑问中!
引用类,才有对象,而对象中包括成员变量、构造方法、方法,成员变量描述对象的属性,方法描述的是行为。构造方法是来初始化成员变量的,一般如果不写构造方法,那么系统默认一个构造方法,如果写了就没有了。成员变量有初始值,局部变量没有初始值。
创建对象:类名 引用名 = new 类名();
父类 子类的思考:父类的引用变量可以new一个子类的对象,子类继承父类的成员变量和方法并有自己独有的成员变量和方法
俄罗斯方块Tetris:
1 建立一个格子类Cell,格子的属性有行 列,为格子建立一个构造方法对行列进行赋值,并且格子有输出位置信息的功能。
class Cell{
int row;//格子的行
int col;//格子的列
Cell(int row,int col){//对格子初始化,构造函数
this.row = row;
this.col = col;
}
String toString(){//打印格子位置
return row+","+col;
}
}
2 建立一个Tetromino父类,因为俄罗斯方块是由T,O,L,J,Z,S,I七个方块组成,每个方块都是由4个个字组成,父类可以定义一个由四个格子对象作为元素组成的数组作为成员变量,定义方法建立各型格子的4个格子位置输出;下落;左移;右移。
public class Tetromino{
Cell[] cells;//建立一个由Cell对象组成的数组
public Tetromino(){//构造环境
cells = new Cell[4];//4个格子组成
}
public void print(){//打印4个格子的坐标
String str = "";
for(int i=0;i<cells.length-1;i++){
str += "("+cells[i].toString()+"),";
}
str += "("+cells[cells.length-1].toString()+")";
System.out.println(str);
}
//下落
public void drop(){
for(int i=0;i<cells.length;i++){
cells[i].row ++;
}
}
//左移
public void moveLeft(){
for(int i=0;i<cells.length;i++){
cells[i].col --;
}
}
//右移
public void moveRight(){
for(int i=0;i<cells.length;i++){
cells[i].col ++;
}
}
}
3 生成7个各型格子的子类,引用父类的成员变量和方法
T类:
public class T extends Tetromino{
public T(int row,int col){
cells[0] = new Cell(row,col);
cells[1] = new Cell(row,col+1);
cells[2] = new Cell(row,col+2);
cells[3] = new Cell(row+1,col+1);
}
}
I类:
public class I extends Tetromino{
public I(int row,int col){
cells[0] = new Cell(row,col);
cells[1] = new Cell(row+1,col);
cells[2] = new Cell(row+2,col);
cells[3] = new Cell(row+3,col);
}
}
J类:
public class J extends Tetromino{
public J(int row,int col){
cells[0] = new Cell(row,col);
cells[1] = new Cell(row+1,col);
cells[2] = new Cell(row+2,col);
cells[3] = new Cell(row+2,col-1);
}
}
L类:
public class L extends Tetromino{
public L(int row,int col){
cells[0] = new Cell(row,col);
cells[1] = new Cell(row+1,col);
cells[2] = new Cell(row+2,col);
cells[3] = new Cell(row+2,col+1);
}
}
O类:
public class O extends Tetromino{
public O(int row,int col){
cells[0] = new Cell(row,col);
cells[1] = new Cell(row,col+1);
cells[2] = new Cell(row+1,col);
cells[3] = new Cell(row+1,col+1);
}
}
S类:
public class S extends Tetromino{
public S(int row,int col){
cells[0] = new Cell(row,col);
cells[1] = new Cell(row,col-1);
cells[2] = new Cell(row+1,col-1);
cells[3] = new Cell(row+1,col-2);
}
}
Z类:
public class Z extends Tetromino{
public Z(int row,int col){
cells[0] = new Cell(row,col);
cells[1] = new Cell(row,col+1);
cells[2] = new Cell(row+1,col+1);
cells[3] = new Cell(row+1,col+2);
}
}
4 生成一个测试类TetrominoTest
public class TetrominoTest {
public static void main(String[] args){
System.out.println("------T型格子------");
Tetromino t = new T(15,6);
t.print();
print(t);
System.out.println("------L型格子------");
Tetromino l = new L(15,6);
l.print();
print(l);
System.out.println("------I型格子------");
Tetromino i = new I(15,6);
i.print();
print(i);
System.out.println("------J型格子------");
Tetromino j = new J(15,6);
j.print();
print(j);
System.out.println("------O型格子------");
Tetromino o = new O(15,6);
o.print();
print(o);
System.out.println("------S型格子------");
Tetromino s = new S(15,6);
s.print();
print(s);
System.out.println("------Z型格子------");
Tetromino z = new Z(15,6);
z.print();
print(z);
}
//打印场地
public static void print(Tetromino r){
int totalrow = 20;
int totalcol = 10;
Cell[] cells = r.cells;
for(int row=0;row<totalrow;row++){
for(int col=0;col<totalcol;col++){
boolean flag = true;
for(int i=0;i<cells.length;i++){
if(cells[i].row==row&&cells[i].col==col){
System.out.print("* ");
flag = false;
break;
}
}
if(flag){
System.out.print("- ");
}
}
System.out.println();
}
}
}