в чем разница между внутренним классом и локальным внутренним классом в 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);
}   
}

person DannyD    schedule 01.05.2012    source источник


Ответы (3)


Согласно некоторому официальному руководству по Oracle Java, локальный внутренний класс класс, определенный в блоке кода, а не как часть определения другого класса. Это означает класс, определенный внутри метода или в блоке инициализатора.

Следуя этому определению, MenuListener не является локальным внутренним классом — это просто внутренний класс.

So:

public class Outer {

    public class Inner1 {
    }

    public static class Inner2 {
    }

    public void method(){

        class LocalInner{
        }

        LocalInner yesThisActuallyCompiles = new LocalInner();
    }
}
person trutheality    schedule 01.05.2012
comment
Я только наткнулся на тот факт, что на самом деле можно было объявить классы локальными для методов год или два назад, и до сих пор мне не удалось найти какое-либо практическое применение для этого :( Ну, это, вероятно, к лучшему - person Voo; 01.05.2012
comment
+1 за yesThisActuallyCompiles. Я понятия не имел, что это существовало раньше только сейчас. Мне потребовалось несколько проходов, чтобы увидеть, что класс был обернут в объявление метода. Спасибо за исправление моей ошибки. - person Tim Pote; 01.05.2012
comment
его нельзя пометить как окончательный абстрактный и общедоступный, но он может быть статичным? - person Charlie; 01.04.2014

Если класс является локальным внутренним классом, означает ли это, что он находится внутри метода?

Да.

другого класса

Нет. Класса A, но любой метод должен принадлежать классу.

или это означает, что он просто определен где-то в другом методе.

Да.

Между ними нет большой разницы, кроме разницы между «в другом классе» и «где-то». Не совсем понятно, что вы на самом деле спрашиваете.

person user207421    schedule 01.05.2012

Внутренний класс/класс-член

Нестатический класс, созданный внутри класса, но вне метода, называется внутренним классом-членом.

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();  
     }  
    }
person Shaik khaja Hussain    schedule 19.05.2017