父类中的Java内联类调用方法

时间:2010-11-21 16:54:42

标签: java oop swing mouselistener

我正在开发一个小型Swing应用程序,需要一些帮助。我有一个MouseListener的内联类,并且我想在父类中调用一个方法,但是,this是MouseListener的一个实例。

class ParentClass
{
    void ParentMethod()
    {
        //...
        swing_obj.addMouseListener(
            new MouseListener()
            {
                public void mouseClicked(MouseEvent e)
                {
                    //Want to call this.methodX("str"), but
                    //this is the instance of MouseListener
                }
                public void mouseEntered(MouseEvent e){ }
                public void mouseExited(MouseEvent e){ }
                public void mousePressed(MouseEvent e){ }
                public void mouseReleased(MouseEvent e){ }
            }
        );
        //...
    }
    void methodX(String x)
    {
        //...
    }
}

任何帮助都将不胜感激。

3 个答案:

答案 0 :(得分:3)

即使this是匿名类型的实例,您仍然可以致电methodX("str") - 只需不要在this前加上。

如果你想要明确,我认为一些语法可以让你这样做 - 你可以写

ParentClass.this.methodX("str");

但我个人不打算明确,除非你真的需要(例如消除MouseListener中方法的来电歧义。

答案 1 :(得分:1)

除了从通话中删除this之外,您无需执行任何操作。

如果您仍想使用this,则必须使用前缀ParentClass。例如。 ParentClass.this.methodX(...) ......但那只是丑陋的,应该在需要时使用(命名冲突等)。

答案 2 :(得分:0)

正如其他人所说,只需删除this.,您就可以在外部类中调用方法。在极少数情况下,当外部类和嵌套类具有带有相同名称和参数列表的methodS时,可以使用OuterClass.this.someMehtod(...);来调用它。

为了在编写匿名内部类时更清晰的代码,我建议你使用适配器。对于许多Swings接口,有实现它们的抽象适配器,您只能覆盖感兴趣的方法。在这种情况下,它将是MouseAdapter

class ParentClass
{
    void ParentMethod()
    {
        swing_obj.addMouseListener(new MouseAdapter()
        {
            @Override
            public void mouseClicked(MouseEvent e)
            {
                someMethodX();
            }
        });
    }

    void methodX(String x)
    {
        //...
    }
}