这段java代码不明白啊

JFramejf=newJFrame(“cc”);Containerc=jf.getContentPane();为什么Container这个类不用new就可以创建对象呢... JFrame jf = new JFrame(“cc”); Container c = jf.getContentPane(); 为什么Container这个类不用new就可以创建对象呢 展开
 我来答
李晓健
2013-07-30 · TA获得超过183个赞
知道小有建树答主
回答量:293
采纳率:0%
帮助的人:193万
展开全部
这个可以看一下源码 jf.getContentPane(); 这个方法返回的应该就是一个Container 类

方法可能是这样的
public Container getContentPane(){

//在这里new了一个 Container c= new Container()
//实现代码 ........
return c;

}

这样在外面就不用再new一次了
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友afe836d
2013-07-30 · TA获得超过635个赞
知道小有建树答主
回答量:367
采纳率:50%
帮助的人:305万
展开全部

这个我们可以分析下源码,首先来看下构造函数:

public JFrame(String title) throws HeadlessException {
        super(title);
        frameInit();
    }

在构造函数中调用了frameInit()方法,那么我们再来看下这个方法的实现:

protected void frameInit() {
        enableEvents(AWTEvent.KEY_EVENT_MASK | AWTEvent.WINDOW_EVENT_MASK);
        setLocale( JComponent.getDefaultLocale() );
        setRootPane(createRootPane());
        setBackground(UIManager.getColor("control"));
        setRootPaneCheckingEnabled(true);
        if (JFrame.isDefaultLookAndFeelDecorated()) {
            boolean supportsWindowDecorations = 
            UIManager.getLookAndFeel().getSupportsWindowDecorations();
            if (supportsWindowDecorations) {
                setUndecorated(true);
                getRootPane().setWindowDecorationStyle(JRootPane.FRAME);
            }
        }
        sun.awt.SunToolkit.checkAndSetPolicy(this, true);
    }

请注意,在这个方法中setRootPane(createRootPane());调用了createRootPane(),new了一个JRootPane对象。我们再来看下JFrame类中的getContentPane()方法

public Container getContentPane() { 
        return getRootPane().getContentPane(); 
    }

看到了吗?天啊,它调用了JRootPane对象的getContentPane()方法。哦,好吧,那让我们再看看JRootPane的构造方法做了什么:

public JRootPane() {
        setGlassPane(createGlassPane());
        setLayeredPane(createLayeredPane());
        setContentPane(createContentPane());
        setLayout(createRootLayout());
        setDoubleBuffered(true);
updateUI();
    }

噢,发现了么,在这个该死的构造方法发生了什么?它使用了setContentPane( createContentPane())方法初始化了ContentPane,它使用了createContentPane()创建了ContentPane。oh, god, 让我们来看看吧,这个createContentPane()背着我们都做了什么勾当:

protected Container createContentPane() {
        JComponent c = new JPanel();
        c.setName(this.getName()+".contentPane");
        c.setLayout(new BorderLayout() {
            /* This BorderLayout subclass maps a null constraint to CENTER.
             * Although the reference BorderLayout also does this, some VMs
             * throw an IllegalArgumentException.
             */
            public void addLayoutComponent(Component comp, Object constraints) {
                if (constraints == null) {
                    constraints = BorderLayout.CENTER;
                }
                super.addLayoutComponent(comp, constraints);
            }
        });
        return c;
    }

看到了么,看到了么,它new 了一个JComponent,这个该死的JComponent就是Container的子类。


哦,好吧,让我们再回想下这个过程,new JFrame()的时候创建了JRootPane,而在new JRootPane的时候又创建JComponent。看到了么,其实就是他妈的这么回事儿。

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
bluend1004
2013-07-30 · 超过35用户采纳过TA的回答
知道答主
回答量:147
采纳率:0%
帮助的人:100万
展开全部
好,你读下jf.getContentPane();的源码就知道了,这种直接get出来的对象大都为单例模式,在getContentPane方法内,new 一个Container 对象
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
匿名用户
2013-07-30
展开全部
JFrame类里面的getContentPane()方法是通过JRootPane类的getContentPane()方法获取的Container对象;在JRootPane类生成对象的时候,它默认的构造函数生成了一个Container对象,所以它是有new的。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
路亚向前冲8t
2013-07-30 · TA获得超过484个赞
知道小有建树答主
回答量:636
采纳率:0%
帮助的人:438万
展开全部
你这个要讲全,1、2句讲不清楚的。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式