2012-05-01 23 views
1

クラスがローカルの内部クラスである場合、これは別のクラスのメソッドの中にあることを意味しますか、それは他のメソッドのどこかで定義されていることを意味しますか?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); 
} 
} 

答えて

9

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

メソッドの内部で、このクラスをインスタンス化し、これまでに持っている必要があります驚いたことにそれを実用的に使うことができませんでした:(おそらく、おそらく – Voo

+0

+1のために 'yesThisActuallyCompiles'のために+1していましたが、今のところこれまで存在しているとは思えませんでした。メソッド宣言にラップされています。私の間違いを訂正してくれてありがとう。 –

+0

最終抽象クラスと公開クラスはマークできませんが、静的にすることはできますか? – Charlie

1

クラスがローカル内部クラスである場合には、これは 方法

はい内側にあることを意味しています。

クラスの別のクラス

号の

が、任意のメソッドは、クラスでなければなりません。

別の方法のどこかで定義されていることを意味しますか。

はい。

「別のクラス」と「どこか」の違いを除いて、これらの間に大きな違いはありません。実際に何を求めているのかは分かりません。

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でローカル内部クラスと呼ばれています。ローカル内部クラスのメソッドを呼び出したい場合は、私は1年か2年前の1が実際にメソッドへのローカルクラスを宣言することができたという事実につまずい

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(); 
    } 
    } 
関連する問題