2010-05-13 70 views
4

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

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! 

感谢

+2

它应该只是工作。你有什么编译器错误? – BalusC 2010-05-13 00:36:27

回答

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

+0

啊,你说得对。我的错误是试图做到这一点。尝试查看IDE中可用的方法。 – 2010-05-13 00:51:21

+0

'1> 2'?这不合逻辑! ;) – BalusC 2010-05-13 00:52:41

+1

这是合乎逻辑的 - 它只是不正确。 ;-)(我想有人会引用我现在的星际迷航或现在的一幕......) – mdma 2010-05-13 01:00:34

0

失败一切你可以定义一个自引用属性:

MyClass current = this;

,并使用..

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

+0

啊,那肯定是个好主意! – 2010-05-13 00:34:21

+1

如果你的意思是把它放在内部类中,那就不太合适 - 'this'指针将指向内部类。为了得到外部类的这个指针,你必须用外部类的名字来限定它,例如OuterClass.this。 – mdma 2010-05-13 00:43:54

+0

同意,我想你可能会误解 - 我们讨论的是在外部类中声明自引用,并在内部类中使用它 - 如前所述,可以从内部类访问外部类属性。 – 2010-05-13 00:45:42

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); 
    } 

} 
相关问题