代码之家  ›  专栏  ›  技术社区  ›  Tim Cooper

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

  •  0
  • Tim Cooper  · 技术社区  · 15 年前

    我正在处理一个小的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 回复  |  直到 15 年前
        1
  •  3
  •   Jon Skeet    15 年前

    尽管 this 是匿名类型的实例,您应该仍然能够调用 methodX("str") -只是不要用前缀 .

    如果你想说清楚,我想 一些语法可以让你做到-你可以写

    ParentClass.this.methodX("str");
    

    但就我个人而言,除非您真的必须(例如,要消除来自 MouseListener ).

        2
  •  1
  •   dacwe    15 年前

    你不需要做任何事,只要把 this 从电话里。

    如果你还想用 你必须有前缀 ParentClass . 例如。 ParentClass.this.methodX(...) ... 但这很难看,应该在需要时使用(命名冲突等)。

        3
  •  0
  •   Uhlen    15 年前

    正如其他人所说,只需删除 this. 您应该能够在外部类中调用方法。在极少数情况下,当外部类和嵌套类具有与您调用它的名称和参数列表相同的方法时 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)
        {
            //...
        }
    }