建立JFrame的语法.哪个是对的?

Jer*_*son 2 java inheritance swing composition jframe

我对编程很新,对Java来说也是新手.我在今年秋天开始开设计算机科学课程之前就开始自学,我对两种不同作者的语法有好奇心.在一本书中,通常通过使类成为JFrame的扩展来建立JFrame

public class MyClass extends JFrame {
Run Code Online (Sandbox Code Playgroud)

等等

但是,另一位作者以及本网站上的问题通常会在课程内部建立一个框架:

public class MyClass {
JFrame frame = new JFrame();
Run Code Online (Sandbox Code Playgroud)

首先,一个优于另一个的优势是什么?在我看来,我并不是一个专家,将类作为JFrame的扩展可以更容易地设置框架的参数并且还可以向其添加组件.

你只想说扩展格式的IE

add(component);
Run Code Online (Sandbox Code Playgroud)

但是,在其他格式中,必须键入:

frame.getContentPane().add(component);
Run Code Online (Sandbox Code Playgroud)

这似乎更乏味.

有人可以简洁地解释这背后的原因,或者只是一个偏好的问题.我已经调查了这个并且无法得到直接的答案.

Hov*_*els 5

哲学和实践的原因很多(包括我)更喜欢后者:

  • 一般来说,首选组合而不是继承.
  • 如果您计划更改其固有行为(即,覆盖其一个或多个方法),则仅扩展一个类.
  • 通过不扩展JFrame,可以更容易地创建最大化内聚和最小化耦合的类,并编写干净的基于MVC的代码.此概念的一个更重要的示例是避免让您的GUI代码(您的视图代码)实现任何侦听器接口(您的控制代码).它适用于婴儿程序,但不适用于有可能变得复杂的成熟代码.
  • 通过不扩展大型复杂的类(如JFrame),可以降低难以调试隐藏的覆盖错误行为的风险.尝试扩展JFrame或JPanel并给出类a getX()getY()方法来看看我的意思!
  • 如果您使用的IDE提供了类对象可用方法的建议,那么如果不覆盖巨大的复杂类(如JFrame),则可以大大减少可能的建议方法的数量(和复杂性).
  • 通过调整Swing GUI来创建JPanel而不是覆盖JFrame,您可以大大提高GUI的使用灵活性.现在它可以放在JDialog,JOptionPane,JApplet中,作为更复杂的GUI的一部分放在另一个JPanel中,或者作为CardLayout视图交换的一部分....我可以继续.
  • 与上面相同,我的许多GUI都是这样做的,创建JPanels,我可以通过将它们放在JFrames中的小测试程序中进行单独测试,然后再将它们添加到更大的整个应用程序中.