为什么最后一个数组没有询问第一个数组?

时间:2014-06-21 12:49:34

标签: java arrays

我尝试在第一个数组中保留一些值,然后在第二个数组中保持另一个值,我尝试打印第一个数组并返回第二个数组值。有什么想法吗?

这是调用程序的主要方法

public class testC
{
    public static void main(String[] args)
    {
        groupC trial = new groupC();
        trial.setCol(10, 10);
    }
}

这是类调用另一个类来获取颜色并在每个新坐标中填充数组

public class groupC
{
    private color1 col = new color1();
    private int[] cola1 = new int[3];
    private int[] cola2 = new int[3];

    public groupC()
    {

    }

    public void setCol(int xIn, int yIn)
    {
        cola1 = col.getCol(xIn, yIn);
        System.out.println(cola1[0] + " " + cola1[1] + " " + cola1[2]);
        /* try next color depending on 1st */
        cola2 = col.getCol(xIn + 100, yIn + 100);
        System.out.println(cola2[0] + " " + cola2[1] + " " + cola2[2]);

        System.out.println("this is 1st color, but why now the same as 2nd  ?" + cola1[0] + " " + cola1[1] + " " + cola1[2]);
    }
}

这是类,它只是获取坐标并返回该点的颜色值数组

import java.awt.Color;
import java.awt.Robot;
import java.awt.AWTException;

public class color1
{
    int[] color = new int[3];

    public color1()
    {
    }

    public int[] getCol(int xIn, int yIn)
    {
        // accepts position of color, returns size 3 array of red green blue
        // integers
        try
        {
            Robot r = new Robot();
            Color x = r.getPixelColor(xIn, yIn);
            color[0] = x.getRed();
            color[1] = x.getGreen();
            color[2] = x.getBlue();
        }
        catch (AWTException e)
        {
            e.printStackTrace();
        }
        return color;
    }
}

3 个答案:

答案 0 :(得分:3)

因为color1 重用单个数组:

public class color1
{
    int[] color = new int[3]; // <== Creates one array for this color1 instance
    // ...
}

getCol中发生的一切都是(再次)填写:

Color x = r.getPixelColor(xIn, yIn);
color[0] = x.getRed();   // <==== Nothing here is creating a new color array
color[1] = x.getGreen();
color[2] = x.getBlue();

如果要使用多个数组,则必须实际创建多个数组。这可能意味着完全删除color实例成员,并在getCol中创建数组:

import java.awt.Color; import java.awt.Robot; import java.awt.AWTException;

public class color1
{
    public color1()
    {
    }

    public int[] getCol(int xIn, int yIn)
    {
        // accepts position of color, returns size 3 array of red green blue
        // integers
        int[] color = new int[3]; // Has to be here because of how you're (not) handling exceptions
        try
        {
            Robot r = new Robot();
            Color x = r.getPixelColor(xIn, yIn);
            color[0] = x.getRed();
            color[1] = x.getGreen();
            color[2] = x.getBlue();
        }
        catch (AWTException e)
        {
            e.printStackTrace();
        }
        return color;
    }
}

答案 1 :(得分:1)

您实际上只填充单个数组 - 并在每次调用getCol时覆盖它。因此,cola1cola2的值最终会引用相同的数组,而您希望它们引用不同的数组。

您可能应该在getCol中创建一个新数组,将color声明为局部变量而不是字段:

// Note rename of method to be more descriptive
public int[] getColorComponents(int xIn, int yIn)
{
    int[] components = new int[3];
    // accepts position of color, returns size 3 array of red green blue
    // integers
    try
    {
        Robot r = new Robot();
        Color x = r.getPixelColor(xIn, yIn);
        components[0] = x.getRed();
        components[1] = x.getGreen();
        components[2] = x.getBlue();
    }
    catch (AWTException e)
    {
        e.printStackTrace();
    }
    return components;
}

(顺便说一下,通过捕获它们来处理“处理”异常,打印堆栈跟踪然后继续,好像什么都没有出错几乎从来都不是正确的方法。此外,你应该在你的命名工作 - 没有你的班级名称描述了它们的用途,并且都违反了Java命名约定。)

答案 2 :(得分:0)

数组变量是Java中的引用,因此如果您将一个数组变量分配给另一个,并修改其中一个,那么另一个也会被修改:

int[] a = new int[3];
int[] b;
b = a;
b[0] = 42;
System.out.println(a[0]);  //: 42

要解决此问题,请将以下内容添加到getCol的开头:

color = new int[3];

更好:将color作为getCol的本地变量:

int[] color = new int[3];