如何将变量传递给内部类

时间:2012-12-07 21:43:05

标签: java parameter-passing inner-classes

我想在canvas内使用mousePressed。我怎么能这样做?

public DragManager(Canvas canvas)
{
    canvas.addMouseListener(new MouseAdapter() {
        @Override public void mousePressed(MouseEvent e)
        {
            canvas.something(); // does not work.
        }
    });
}

5 个答案:

答案 0 :(得分:2)

使参数最终:

public DragManager(final Canvas canvas)

答案 1 :(得分:2)

正如这里的许多人已经说过你必须让函数参数最终。

public DragManager(final Canvas canvas)
{
    canvas.addMouseListener(new MouseAdapter() {
        @Override public void mousePressed(MouseEvent e)
        {
            canvas.something();
        }
    });
}

这意味着此变量不能指向任何其他对象。例如。你不能在函数内做到这一点:

canvas = SomeOtherCanvas

如果使用本地类定义创建对象,则在从堆栈中放弃局部变量之后(在DragManager构造函数完成之后),该对象可以保持“生存”。它必须有本地值的副本。如果你将这个参数设为final(所以它保证构造函数中的引用不会指向其他地方),那么复制很容易:只需复制一个引用。如果没有这样的规则你(好吧,不是你个人,但Java语言)需要不断地同步这些值,这将是更复杂和缓慢的解决方案。

答案 2 :(得分:1)

你不能在定义的内部类中引用非final变量。将你的画布标记为最终。

public void DragManager(final Canvas canvas)
    {

        canvas.addMouseListener(new MouseAdapter() {
            @Override public void mousePressed(MouseEvent e)
            {
                System.out.println(canvas);;// does not work.
            }
        });

答案 3 :(得分:0)

public DragManager(final Canvas canvas)
{
    canvas.addMouseListener(new MouseAdapter() {
        @Override public void mousePressed(MouseEvent e)
        {
            canvas.something(); // does work.
        }
    });
}

因为您可以修改canvas变量,所以应该将其定义为final(常量引用)。

答案 4 :(得分:0)

不使用最终关键字。您可以添加返回 Init 方法并添加私有变量。 通过Call Init方法传递canvas。

public DragManager(Canvas canvas)
{
    canvas.addMouseListener(new MouseAdapter() {
        Canvas _canvas;
        @Override public void mousePressed(MouseEvent e)
        {
            _canvas.something(); // does not work.
        }
        public MouseAdapter Init(Canvas canvas){
            _canvas = canvas;
            return this;
        }
    }.Init(canvas));
}