java中的内部类和本地内部类之间有什么区别?

时间:2012-05-01 02:08:01

标签: java actionlistener inner-classes

如果一个类是一个本地内部类,这是否意味着它在另一个类的方法中,或者它是否意味着它只是在某个地方的另一个方法中定义。

例如,在下面的代码中,MenuListener是否被视为内部本地类?

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class MenuDemo extends JFrame{
private Container c;
private ImageIcon[] images = new ImageIcon[5];
private JLabel picture;
private JPanel mainPanel;
private JMenuBar menuBar;
private JMenu menu;
private JMenuItem bird,cat,dog,rabbit,pig;

public MenuDemo() {
    super("Menu Demo");

    c = getContentPane();
    c.setLayout(new BorderLayout());

    mainPanel = new JPanel();

    // Store the animal pictures in an array.
    for (int i=0; i<5; i++){
        images[i] = new ImageIcon("image" + i + ".gif");
    }
    //Set up the picture label.
    picture = new JLabel(images[0]);
    picture.setPreferredSize(new Dimension(177,122));
    mainPanel.add(picture, BorderLayout.CENTER);
    c.add(mainPanel);
    buildMenuBar();
    this.setJMenuBar(menuBar);
    pack();
    setVisible(true);
}

private void buildMenuBar(){
    MenuListener listener = new MenuListener();
    menuBar = new JMenuBar();

    menu = new JMenu("Animals");
    menu.setMnemonic(KeyEvent.VK_A);
    menuBar.add(menu);

    bird = new JMenuItem("Bird", KeyEvent.VK_B);
    bird.addActionListener(listener);
    menu.add(bird);

    cat = new JMenuItem("Cat", KeyEvent.VK_C);
    cat.addActionListener(listener);
    menu.add(cat);

    dog = new JMenuItem("Dog", KeyEvent.VK_D);
    dog.addActionListener(listener);
    menu.add(dog);

    rabbit = new JMenuItem("Rabbit", KeyEvent.VK_R);
    rabbit.addActionListener(listener);
    menu.add(rabbit);

    pig = new JMenuItem("Pig", KeyEvent.VK_P);
    pig.addActionListener(listener);
    menu.add(pig);
}

private class MenuListener implements ActionListener {
    public void actionPerformed(ActionEvent e){
        if (e.getSource() == bird)
            picture.setIcon(images[0]);
        else if (e.getSource() == cat)
            picture.setIcon(images[1]);
        else if (e.getSource() == dog)
            picture.setIcon(images[2]);
        else if (e.getSource() == rabbit)
            picture.setIcon(images[3]);
        if (e.getSource() == pig)
            picture.setIcon(images[4]);
    }
}

public static void main(String[] args){
    MenuDemo m = new MenuDemo();
    m.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}   
}

3 个答案:

答案 0 :(得分:11)

According to some official Oracle Java tutorial,本地内部类是在代码块中定义的类,而不是另一个类定义的一部分。这意味着在方法或初始化程序块中定义的类。

遵循该定义,MenuListener不是本地内部类 - 它只是一个内部类。

所以:

public class Outer {

    public class Inner1 {
    }

    public static class Inner2 {
    }

    public void method(){

        class LocalInner{
        }

        LocalInner yesThisActuallyCompiles = new LocalInner();
    }
}

答案 1 :(得分:1)

  

如果一个类是本地内部类,这是否意味着它在一个内部   方法

  

另一个班级

没有。 a 类,但任何方法都必须在类中。

  

或者它是否意味着它只是在中定义   另一种方法。

这些之间没有太大区别,除了“在另一个班级”和“某个地方”之间的区别。你真正要问的是什么并不是很清楚。

答案 2 :(得分:0)

内部班级/会员班级

在类中但在方法外部创建的非静态类称为成员内部类。

class TestMemberOuter1{  
 private int data=30;  
 class Inner{  
  void msg(){System.out.println("data is "+data);}  
 }  
 public static void main(String args[]){  
  TestMemberOuter1 obj=new TestMemberOuter1();  
  TestMemberOuter1.Inner in=obj.new Inner();  
  in.msg();  
 }  
}

本地内部课程

在方法内创建的类在java中称为本地内部类。如果要调用本地内部类的方法,则必须在方法

中实例化此类
   public class localInner1{  
     private int data=30; 
     void display(){  
      class Local{  
       void msg(){System.out.println(data);}  
      }  
      Local l=new Local();  
      l.msg();  
     }  
     public static void main(String args[]){  
      localInner1 obj=new localInner1();  
      obj.display();  
     }  
    }