Java 2个不同的继承类覆盖

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

我必须在一个ANSI项目上工作,它需要一些2D数组。我有两个基类的派生类(基类是2D对象数组)。当我尝试将较小的(形状)数组添加到较大的(贴图)数组中时,它会覆盖较大数组的维度

代码:

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不,它们每个类只存在一次——不管有多少其他类是从这个类派生出来的。此外,即使创建同一派生类的两个实例,也会出现问题。