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

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

例如,在下面的代码中,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); } } 

根据一些官方的Oracle Java教程 ,本地内部类是在代码块中定义的类,而不是另一个类定义的一部分。 这意味着在方法或初始化程序块中定义的类。

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

所以:

 public class Outer { public class Inner1 { } public static class Inner2 { } public void method(){ class LocalInner{ } LocalInner yesThisActuallyCompiles = new LocalInner(); } } 

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

是。

另一堂课

没有。但是任何方法都必须在课堂上。

或者它是否意味着它只是在某个地方用另一种方法定义的。

是。

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

内class/会员class

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

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

本地内部class级

在方法内创建的类在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(); } }