Java 2个不同的继承类覆盖
我必须在一个ANSI项目上工作,它需要一些2D数组。我有两个基类的派生类(基类是2D对象数组)。当我尝试将较小的(形状)数组添加到较大的(贴图)数组中时,它会覆盖较大数组的维度 代码:Java 2个不同的继承类覆盖,java,multidimensional-array,Java,Multidimensional Array,我必须在一个ANSI项目上工作,它需要一些2D数组。我有两个基类的派生类(基类是2D对象数组)。当我尝试将较小的(形状)数组添加到较大的(贴图)数组中时,它会覆盖较大数组的维度 代码: import java.util.Scanner; import java.io.*; public class shape extends pixelGrid { public String name; private static boolean hasDimension; private static b
import java.util.Scanner;
import java.io.*;
public class shape extends pixelGrid
{
public String name;
private static boolean hasDimension;
private static boolean hasDefaultCell;
public shape(String n)
{
name = n;
hasDimension = false;
hasDefaultCell = false;
draw();
}
public void draw()
{
try(Scanner parser = new Scanner(new File (name +".cmd")))
{
String commandToken = parser.nextLine();
System.out.println("Line(shape): " + commandToken);
while(commandToken.charAt(0) != 'q')
{
Scanner sc = new Scanner(commandToken);
String commandLine = sc.next();
System.out.println("command(shape):" + commandLine);
if(commandLine.equals("d") && !hasDimension)
{
setDimension(commandToken);
hasDimension = true;
}
else if(commandLine.equals("b") && !hasDefaultCell)
{
setDefaultCell(commandToken);
hasDefaultCell = true;
}
else if(hasDimension && hasDefaultCell)
{
char command = commandToken.charAt(0);
switch(command)
{
case 'l':
drawLine(commandToken);
break;
case 'c':
drawCircle(commandToken);
break;
case 'p':
drawPoint(commandToken);
break;
case 'e':
erase(commandToken);
break;
case 'x':
ANSI.cls();
break;
default:
commandToken = parser.nextLine();
break;
}
}
commandToken = parser.nextLine();
}
}
catch(IOException e)
{
System.out.println( "\nError reading input file(from shape): " + name);
e.printStackTrace();
}
}
private static void setDefaultCell(String command)
{
Scanner parser = new Scanner(command);
parser.next();
String token = parser.next();
char c;
if(token.equals("space"))
{
c = ' ';
}
else
{
c = token.charAt(0);
}
int fg = ANSI.color2Int(parser.next());
int bg = ANSI.color2Int(parser.next());
parser.close();
pixelCell cell = new pixelCell(c,fg,bg);
setDefaultCell(cell);
clearMap(getDefaultCell());
System.out.println("Default Cell: " + getDefaultCell());
}
private static void setDimension(String command)
{
Scanner parser = new Scanner(command);
System.out.println("command(shape): " + command);
parser.next();
int w = parser.nextInt();
int h = parser.nextInt();
setDimension(w,h);
System.out.println("Dimensions: " + getWidth() + " x " + getHeight());
}
//...
}
public class project2
{
private static bitMap map;
private static boolean hasDimension;
private static boolean hasDefaultCell;
public project2()
{
hasDimension = false;
hasDefaultCell = false;
}
public static void main(String args[])
{
try(Scanner parser = new Scanner(new File(args[0])))
{
String commandToken = parser.nextLine();
System.out.println("Line: " + commandToken);
while (commandToken.charAt(0) != 'q' )
{
Scanner sc = new Scanner(commandToken);
String commandLine = sc.next();
System.out.println("command:" + commandLine);
if(commandLine.equals("d") && !hasDimension)
{
System.out.println("checkPoint! " + commandToken);
setDimension(commandToken);
hasDimension = true;
}
else if(commandLine.equals("b") && !hasDefaultCell)
{
System.out.println("checkPoint! " + commandToken);
setDefaultCell(commandToken);
hasDefaultCell = true;
}
else if(hasDimension && hasDefaultCell)
{
char command = commandToken.charAt(0);
System.out.println("checkPoint! " + commandToken);
switch(command)
{
case 'e':
erase(commandToken);
break;
case 'x':
ANSI.cls();
break;
default:
processShape(commandToken);
break;
}
}
commandToken = parser.nextLine();
}
}
catch(ArrayIndexOutOfBoundsException e)
{
if(e.getMessage().equals("p"))
{
System.out.println( "\nPlot - ArrayIndexOutOfBoundsException\n\n" );
}
else
{
System.out.println( "\nError reading input file: " + args[0] );
e.printStackTrace();
}
}
catch(IOException e)
{
System.out.println( "\nError reading input file(from main): " + args[0]);
e.printStackTrace();
}
catch ( Exception e )
{
throw e;
}
ANSI.cls();
map.printMap();
System.out.println("Dimensions(map): " + map.getWidth() + " x " + map.getHeight());
}
private static void processShape(String command)
{
Scanner parser = new Scanner(command);
String name = parser.next();
int x = parser.nextInt();
int y = parser.nextInt();
String o = parser.next();
parser.close();
System.out.println("Shape Name: "+ name);
System.out.println("Location: " + x + " , " + y);
System.out.println("Dimensions(Map > pre-shape-proc): " + map.getWidth() + " x " + map.getHeight());
bitMap b = new bitMap(map.getWidth(),map.getHeight());
System.out.println("Dimensions(Map > pre-shape-proc): " + b.getWidth() + " x " + b.getHeight());
shape s = new shape(name);
System.out.println("Dimensions(map > after-shape-creation): " + map.getWidth() + " x " + map.getHeight());
System.out.println("Dimensions(Map > after): " + b.getWidth() + " x " + b.getHeight());
System.out.println("Shape Dimension: " + s.getWidth() + " x " + s.getHeight());
map.addShape(x,y,s);
}
private static void setDefaultCell(String command)
{
Scanner parser = new Scanner(command);
parser.next();
String token = parser.next();
char c;
if(token.equals("space"))
{
c = ' ';
}
else
{
c = token.charAt(0);
}
int fg = ANSI.color2Int(parser.next());
int bg = ANSI.color2Int(parser.next());
parser.close();
pixelCell cell = new pixelCell(c,fg,bg);
map.setDefaultCell(cell);
map.clearMap(map.getDefaultCell());
System.out.println("Default Cell: " + map.getDefaultCell());
}
private static void setDimension(String command)
{
Scanner parser = new Scanner(command);
System.out.println("command: " + command);
parser.next();
int w = parser.nextInt();
int h = parser.nextInt();
map = new bitMap(w,h);
System.out.println("Dimensions: " + map.getWidth() + " x " + map.getHeight());
}
public static void erase(String command)
{
Scanner parser = new Scanner(command);
parser.next();
char c = parser.next().charAt(0);
int fg = ANSI.color2Int(parser.next());
int bg = ANSI.color2Int(parser.next());
parser.close();
pixelCell cell = new pixelCell(c,fg,bg);
map.clearMap(cell);
}
}
基类
public class pixelGrid
{
private static pixelCell[][] bitMap;
private static pixelCell defaultCell;
public pixelGrid()
{
defaultCell = new pixelCell();
}
public pixelGrid(int width, int height)
{
bitMap = new pixelCell[width][height];
defaultCell = new pixelCell();
}
public static void setDimension(int width, int height)
{
bitMap = new pixelCell[width][height];
}
//...
}
较小的网格:
import java.util.Scanner;
import java.io.*;
public class shape extends pixelGrid
{
public String name;
private static boolean hasDimension;
private static boolean hasDefaultCell;
public shape(String n)
{
name = n;
hasDimension = false;
hasDefaultCell = false;
draw();
}
public void draw()
{
try(Scanner parser = new Scanner(new File (name +".cmd")))
{
String commandToken = parser.nextLine();
System.out.println("Line(shape): " + commandToken);
while(commandToken.charAt(0) != 'q')
{
Scanner sc = new Scanner(commandToken);
String commandLine = sc.next();
System.out.println("command(shape):" + commandLine);
if(commandLine.equals("d") && !hasDimension)
{
setDimension(commandToken);
hasDimension = true;
}
else if(commandLine.equals("b") && !hasDefaultCell)
{
setDefaultCell(commandToken);
hasDefaultCell = true;
}
else if(hasDimension && hasDefaultCell)
{
char command = commandToken.charAt(0);
switch(command)
{
case 'l':
drawLine(commandToken);
break;
case 'c':
drawCircle(commandToken);
break;
case 'p':
drawPoint(commandToken);
break;
case 'e':
erase(commandToken);
break;
case 'x':
ANSI.cls();
break;
default:
commandToken = parser.nextLine();
break;
}
}
commandToken = parser.nextLine();
}
}
catch(IOException e)
{
System.out.println( "\nError reading input file(from shape): " + name);
e.printStackTrace();
}
}
private static void setDefaultCell(String command)
{
Scanner parser = new Scanner(command);
parser.next();
String token = parser.next();
char c;
if(token.equals("space"))
{
c = ' ';
}
else
{
c = token.charAt(0);
}
int fg = ANSI.color2Int(parser.next());
int bg = ANSI.color2Int(parser.next());
parser.close();
pixelCell cell = new pixelCell(c,fg,bg);
setDefaultCell(cell);
clearMap(getDefaultCell());
System.out.println("Default Cell: " + getDefaultCell());
}
private static void setDimension(String command)
{
Scanner parser = new Scanner(command);
System.out.println("command(shape): " + command);
parser.next();
int w = parser.nextInt();
int h = parser.nextInt();
setDimension(w,h);
System.out.println("Dimensions: " + getWidth() + " x " + getHeight());
}
//...
}
public class project2
{
private static bitMap map;
private static boolean hasDimension;
private static boolean hasDefaultCell;
public project2()
{
hasDimension = false;
hasDefaultCell = false;
}
public static void main(String args[])
{
try(Scanner parser = new Scanner(new File(args[0])))
{
String commandToken = parser.nextLine();
System.out.println("Line: " + commandToken);
while (commandToken.charAt(0) != 'q' )
{
Scanner sc = new Scanner(commandToken);
String commandLine = sc.next();
System.out.println("command:" + commandLine);
if(commandLine.equals("d") && !hasDimension)
{
System.out.println("checkPoint! " + commandToken);
setDimension(commandToken);
hasDimension = true;
}
else if(commandLine.equals("b") && !hasDefaultCell)
{
System.out.println("checkPoint! " + commandToken);
setDefaultCell(commandToken);
hasDefaultCell = true;
}
else if(hasDimension && hasDefaultCell)
{
char command = commandToken.charAt(0);
System.out.println("checkPoint! " + commandToken);
switch(command)
{
case 'e':
erase(commandToken);
break;
case 'x':
ANSI.cls();
break;
default:
processShape(commandToken);
break;
}
}
commandToken = parser.nextLine();
}
}
catch(ArrayIndexOutOfBoundsException e)
{
if(e.getMessage().equals("p"))
{
System.out.println( "\nPlot - ArrayIndexOutOfBoundsException\n\n" );
}
else
{
System.out.println( "\nError reading input file: " + args[0] );
e.printStackTrace();
}
}
catch(IOException e)
{
System.out.println( "\nError reading input file(from main): " + args[0]);
e.printStackTrace();
}
catch ( Exception e )
{
throw e;
}
ANSI.cls();
map.printMap();
System.out.println("Dimensions(map): " + map.getWidth() + " x " + map.getHeight());
}
private static void processShape(String command)
{
Scanner parser = new Scanner(command);
String name = parser.next();
int x = parser.nextInt();
int y = parser.nextInt();
String o = parser.next();
parser.close();
System.out.println("Shape Name: "+ name);
System.out.println("Location: " + x + " , " + y);
System.out.println("Dimensions(Map > pre-shape-proc): " + map.getWidth() + " x " + map.getHeight());
bitMap b = new bitMap(map.getWidth(),map.getHeight());
System.out.println("Dimensions(Map > pre-shape-proc): " + b.getWidth() + " x " + b.getHeight());
shape s = new shape(name);
System.out.println("Dimensions(map > after-shape-creation): " + map.getWidth() + " x " + map.getHeight());
System.out.println("Dimensions(Map > after): " + b.getWidth() + " x " + b.getHeight());
System.out.println("Shape Dimension: " + s.getWidth() + " x " + s.getHeight());
map.addShape(x,y,s);
}
private static void setDefaultCell(String command)
{
Scanner parser = new Scanner(command);
parser.next();
String token = parser.next();
char c;
if(token.equals("space"))
{
c = ' ';
}
else
{
c = token.charAt(0);
}
int fg = ANSI.color2Int(parser.next());
int bg = ANSI.color2Int(parser.next());
parser.close();
pixelCell cell = new pixelCell(c,fg,bg);
map.setDefaultCell(cell);
map.clearMap(map.getDefaultCell());
System.out.println("Default Cell: " + map.getDefaultCell());
}
private static void setDimension(String command)
{
Scanner parser = new Scanner(command);
System.out.println("command: " + command);
parser.next();
int w = parser.nextInt();
int h = parser.nextInt();
map = new bitMap(w,h);
System.out.println("Dimensions: " + map.getWidth() + " x " + map.getHeight());
}
public static void erase(String command)
{
Scanner parser = new Scanner(command);
parser.next();
char c = parser.next().charAt(0);
int fg = ANSI.color2Int(parser.next());
int bg = ANSI.color2Int(parser.next());
parser.close();
pixelCell cell = new pixelCell(c,fg,bg);
map.clearMap(cell);
}
}
更大的网格
public class bitMap extends pixelGrid
{
public bitMap(int width, int height)
{
super(width, height);
}
public void addShape(int x, int y, shape s)
{
int shapeX = 0;
int shapeY = 0;
System.out.println("Dimensions(map): " + getWidth() + " x " + getHeight());
System.out.println("Dim(shape): " + x + " , " + y + " " + s.getWidth() + " x " + s.getHeight());
for(int w = x; w < (x + s.getWidth()); w++)
{
for(int h = y; h < (y + s.getHeight()); h++)
{
setCell(w,h,s.getCell(shapeX,shapeY));
shapeY++;
}
shapeX++;
shapeY = 0;
}
}
//...
}
问题在于,
pixelGrid
构造函数重新初始化静态属性defaultCell
,因此类(或其派生类之一)的第二次实例化“重置”了所有值
public class pixelGrid
{
private static pixelCell defaultCell;
public pixelGrid()
{
// resets defaultCell
defaultCell = new pixelCell();
}
}
相反,您应该直接初始化static
属性:
private static pixelCell defaultCell = new pixelCell();
或者使用静态初始化块(主要是在除了新的块之外还有更多的事情要做的情况下)
(如果每个派生类需要一次static
属性,则必须在派生类中单独声明它。)
请参见你能发布你的main
-方法吗?你的pixelGrid
构造函数重新初始化static
属性。defaultCell
,因此类的第二次实例化“重置”了所有值。(与第二个ctor的位图
相同)@tomse这是否意味着不会为类的每个派生创建静态
变量?还是我误解了?@DavidLuk不,它们每个类只存在一次——不管有多少其他类是从这个类派生出来的。此外,即使创建同一派生类的两个实例,也会出现问题。