使用内部类中“外部”类的方法

时间:2010-05-13 00:26:03

标签: java

定义嵌套类时,是否可以访问“外部”类的方法?我知道可以访问它的属性,但我似乎找不到使用它的方法的方法。

    addMouseListener(new MouseAdapter() {
        @Override
        public void mouseClicked(MouseEvent e) {
            if (e.getClickCount() == 2 && //<-- Here I'd like to
        }                                 // reference a method
    });                                   //from the class where
                                          //addMouseListener() is defined!

由于

3 个答案:

答案 0 :(得分:4)

由于你的内部类是非静态的,所以外部类的所有方法都会自动对内部类可见,甚至是私有的。

因此,请继续调用您想要的方法。

例如,

   class MyClass extends JPanel
   {

        void doStuff()
        {
        }

        boolean someLogic()
        {
           return 1>2;
        }

        void setupUI() 
        {
            addMouseListener(new MouseAdapter() {
               @Override
               public void mouseClicked(MouseEvent e) {
                 if (e.getClickCount() == 2 && someLogic())
                   doStuff();
               }
            });                                
        }
    }                                       

有关详情,请参阅Sun Tutorial on Nested Classes

答案 1 :(得分:3)

在内部类中使用外部类引用还有另一种技巧,我经常使用它:

class OuterClass extends JFrame {

    private boolean methodName() {
        return true;
    }

    public void doStuff() {
        // uses the local defined method
        addMouseListener(new MouseAdapter() {
           @Override
           public void mouseClicked(MouseEvent e) {
               System.out.println(methodName()); // false
               // localclass method
               System.out.println(OuterClass.this.methodName()); // true
               // outerclass method
               OuterClass.super.addMouseListener(this); // don't run this, btw
               // uses the outerclasses super defined method
           }
           private boolean methodName() {
               return false;
           }
        });                                
    }

    @Override
    public void addMouseListener(MouseListener a) {
        a.mouseClicked(null);
    }

 }

答案 2 :(得分:0)

其他所有内容都无法定义自引用属性:

MyClass current = this;

并使用..

虽然我也想知道真实,干净,回答你的问题!