2012-01-13 165 views
1

我正在从头开始学习Java(慢),但是我一次又一次地在某些“真实”代码处达到峰值,并且发现让我困惑的东西。关于一些java语法的困惑

以下行的人喜欢它:

JPanel panel = (JPanel) container.getContentPane(); 

我的问题是什么是(JPanel)container.getContentPane()之间发生了什么?它不像他们正在倍增的权利?

我知道这是语言的基本部分,并且随着我继续学习,我会到达这一部分,但我非常好奇,想知道它是什么。我真的不知道该如何谷歌才能得到答案。

+2

查找“铸造” – 2012-01-13 19:52:53

+2

我建议您只需通过* entire *基本Java教程/书本工作即可。以下是Oracle针对您当前所询问主题的一个:http://docs.oracle.com/javase/tutorial/java/IandI/subclasses.html – BalusC 2012-01-13 19:56:10

+0

因此,container.getContentPane()返回的结果是作为JPanel对象? – red888 2012-01-13 19:57:55

回答

4

它不像他们正在倍增权吗?

不。意思是“把这个东西当作JPanel。”它被称为类型转换,并且在C++,C#和许多其他语言中使用该语法。

您必须确保这些类彼此相关的方式才能投射。例如,这是行不通的:

JPanel p = new JPanel(); 
JComponent c = (JComponent)p; 
JButton b = (JButton)c; 

JPanelJComponent,所以是JButton,但JButton不会JPanel因此,你可以不投这些对象之间的下降。您还可以从小孩回到父母,例如从JSpinner.DefaultEditor回到JPanel,但不从JPanelJSpinner.DefaultEditor

+0

Neato,现在对我来说非常有意义。我没有在我的Java书中写出,但我记得我曾经玩过的其他一些语言。我猜这个语法应该对我更熟悉。 – red888 2012-01-13 20:03:14

+0

请注意,检查是在运行时完成的,以检查转换是否有效(即,如果转换的东西确实可以视为您要转换的类型)。如果不是,则会在您执行强制转换的行上得到一个'ClassCastException'。此外,应尽可能避免铸造,因为它会带走类型安全。 – Jesper 2012-01-13 22:15:05

0

是的这是如何在java中进行类型转换。正如你所知道的java与引用。在你的情况下,你有一个JPanel类型的引用和container.getContentPane()返回(纠正我,如果我错了,我的Swing有点生疏)容器,所以既然这两个不兼容,你需要输入cast使它们兼容。希望有帮助

1

这被称为类型转换。方法getContentPane()通常会返回一个Container,但我们希望将它置于JPanel中,以便我们能够使用JPanel方法。当然这两种类型必须兼容(例如JPanel是Container的特定实现(例如通过JComponent))