繁体   English   中英

为什么我的内部类看不到我的外部类对象?

[英]Why can't my inner class see my outer class object?

import javax.swing.*;
import javax.swing.event.*;

public class NewGUIStuff{
    public static void main(String args[]){
        NewGUIStuff gui = new NewGUIStuff();
        gui.go();
    }

    class handlesListListeners implements  ListSelectionListener{
        public void valueChanged(ListSelectionEvent lse){
            list.setVisibleRowCount(4);
        }
    }
    public void valueChanged(ListSelectionEvent lse){

    }
    public void go(){
        JFrame frame = new JFrame();
        JPanel panel = new JPanel();
        JList list;

        String[] aList = {"alpha","beta","gamma","delta","epsilon","zeta","eta","theta"};
        list = new JList(aList);
        list.addListSelectionListener(new handlesListListeners());
        JScrollPane scroller = new JScrollPane(list);
        scroller.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
        scroller.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);

        frame.setContentPane(scroller);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(300,300);
        frame.setVisible(true);
    }
}

因此,我的问题是内部类是否可以看到其外部类的变量和对象,内部类handlesListListeners看不到我在NewGUIStuff外部类中NewGUIStufflist对象?

答案是,“您的内部类可以看到外部类”,这不是您的问题。

您的问题是NewGUIStuff类没有供内部类查看的任何成员字段。 您声明的list变量是go方法的局部变量。

public class NewGUIStuff {
    JList list; //this is a member field

    ...

    public void go() {
        ...
        JList list; //this is a local variable
        ...
    }
}

因为列表对象在go()方法的范围之内,而不是NewGUIStuff类的范围。 该列表对象只能在同一方法内“看到”。

非静态内部类可以看到外部类实例变量以及那些局部变量(如果将它们声明为final的话,请考虑一下闭包)(对于匿名内部类)。 这些非静态内部类对编译器插入的外部具有隐式引用, this就是它们如何查看外部类的成员变量的方式。 您将匿名类围起来的最终局部变量将隐式传递到编译器将为您生成的构造函数中,并存储在内部类本身的最终成员字段中。

在您的情况下,我希望您会看到在完全不同的词法上下文中定义的局部变量,而您的内部类对此一无所知。 将其转换为外部类成员变量,您的内部类将看到它。

您的list变量位于go()方法的本地。 如果要使其可见,则需要使其成为NewGUIStuff的实例字段。 像这样:

public class NewGUIStuff {

    private JList list = new JList(); // Member of outer class so in scope from handlesListListeners

    public static void main(String args[]) {
        NewGUIStuff gui = new NewGUIStuff();
        gui.go();
    }

    class handlesListListeners implements  ListSelectionListener {

        public void valueChanged(ListSelectionEvent lse) {
            list.setVisibleRowCount(4);
        }
    }
}

这是因为listgo()函数中的局部变量。 它在handlesListListeners类的范围handlesListListeners

如果list是外部类的实例变量,则内部类将能够看到它。 另外,您也可以将内部类设置为go()函数的局部变量,这意味着该list现在在范围内:

void go() {
    final JList list = ...
    list.addListSelectionListener(new ListSelectionListener() {
        public void valueChanged(ListSelectionEvent event) {
            // list is now in scope
            list.setVisibleRowCount(4);
        }
    });
}

请注意,如果以此方式使用list必须声明该list最终的

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM