Java 扩展JFrame

Java 扩展JFrame,java,swing,inheritance,jframe,composition,Java,Swing,Inheritance,Jframe,Composition,扩展JFrame而不是创建新JFrame的利弊是什么 例如: public class Test extends JFrame { setVisible(true); } 或 您不应该扩展类,除非您希望实际扩展其功能,在您所展示的示例中,您应该使用选项2,因为选项1滥用了extending功能 换句话说,只要问题的答案是测试aJFrame?是NO,它就不应该扩展JFrame不扩展JFrame(或任何摆动组件)的优点: 避免无意的方法重写。我已经讨论过好几次了,第一次是在我给出类intge

扩展JFrame而不是创建新JFrame的利弊是什么

例如:

public class Test extends JFrame {

setVisible(true);

}


您不应该扩展类,除非您希望实际扩展其功能,在您所展示的示例中,您应该使用选项2,因为选项1滥用了
extend
ing功能


换句话说,只要问题的答案是测试a
JFrame
NO,它就不应该扩展
JFrame

不扩展JFrame(或任何摆动组件)的优点:

  • 避免无意的方法重写。我已经讨论过好几次了,第一次是在我给出类
    intgetx()
    intgety()
    方法时。试试看,你会看到一些不那么有趣的异常行为
  • 简化使用Eclipse或NetBeans时可用的方法选项,使其仅适用于您创建的那些方法。这实际上是我最喜欢的优势
  • 利用GUI创建JPanel而不是JFrames,这将部署灵活性提高了100倍
  • 最重要的是,只暴露需要暴露的东西

    • 面向对象设计的规则之一:如果不能继承(扩展)类,则不能继承它们的类

      继承增加了程序的复杂性和连通性,并可能导致新的错误。在您的情况下,并没有任何理由扩展类


      仅当需要访问受保护的成员和/或获取多态行为(覆盖虚拟方法)时,才应扩展类。

      如果扩展JFrame,我希望修改/自定义当前的JFrame类 所以子类可以使用这个定制的实现

      如果JFrame类中没有我想做的更改,只需使用 类似于您在代码中给出的第二个代码片段。我指的是使用 通过在JPanel中创建其他JComponent(例如按钮/标签)等 创建对象测试并将JFrame contentPane设置为此对象。某物 像


      “.你不继承他们的类.”他们的什么?你让我绞尽脑汁想下一个词……)“让您的GUI能够创建JPanel而不是JFrame…”当然可以,但要小心不要落入扩展面板的陷阱(除非实现自定义绘制行为等)。如果我在扩展类中添加了一些方法,我不是在扩展JFrame吗?请回答这个问题。为什么选项1滥用了扩展特性?他没有重写名为setVisible的方法。这是否意味着我不能调用继承的方法?如果担心潜在的子类,为什么不完成扩展JFrame呢?我不认为扩展JFrame来创建一个窗口是错误的,如果它是一个窗口的话。一个学校的例子:一个学生扩展了一个人。学生可以选择登录,个人不可以。窗口“NewTask”提供了根据表单创建新任务的功能,JFrame没有。@DanielKatz-当您扩展类的功能时,或者当您的新类是扩展类的更具体定义(Person->Student或TaskFrame->Frame)时,这很好,这就是类扩展的目的。否则,在一个类中混合两个不同的实体,会使事情变得更复杂、更不清晰,这会损害OOP的基本原则。当然,当你的课堂上只有三行时,这没什么大不了的,但是一旦你写了一些真正的应用程序并且需要维护它,这个习惯就会咬你一口,所以我认为写另一个课堂的“痛苦”从长远来看是值得的。
      public class Test {
      
      JFrame test = new JFrame():
      
      test.setVisible(true);
      
      }
      
      public class Test extends JPanel {
      
         public class() {
          // add buttons/label here
         }
         ...
      
         private static void createAndShowGUI() {
             JFrame frame = new JFrame();
      
             Test object = new Test();
             frame.setContentPane(object.setOpaque(true));
      
             frame.setVisible(true);
         }
      ...
      }