扩展JFrame

11

扩展一个JFrame与创建一个新的JFrame相比有什么优缺点?

例如:

public class Test extends JFrame {

setVisible(true);

}
或者
public class Test {

JFrame test = new JFrame():

test.setVisible(true);

}
4个回答

11

如果你不想扩展一个类的功能,那么就不应该去继承它。在你提供的例子中,应该使用选项2,因为选项1滥用了extend特性。

换句话说,只要回答问题“Test是JFrame吗?”的答案是“不是”,就不应该继承JFrame


如果我在扩展的类中添加一些方法,那么我不是扩展JFrame吗?请回复。为什么选项1滥用了扩展功能?他没有覆盖一个叫做setVisible的方法。这是否意味着我不能调用继承的方法?如果担心可能的子类,为什么不使用finalize扩展JFrame?我认为如果它是一个窗口,扩展JFrame创建窗口并不错误 - Daniel Katz
我正在努力更好地理解。一个学校的例子:学生扩展了人类。学生有登录选项,而人类没有。一个名为“NewTask”的窗口提供了一个根据表单创建新任务的功能,JFrame则没有。 - Daniel Katz
1
@DanielKatz - 当你扩展一个类的功能,或者当你的新类是扩展类的更具体定义(Person->Student或TaskFrame->Frame)时,这是可以的,这就是类扩展的目的。否则,你会在一个类中混合两个不同的实体,使事情变得更加复杂和不清晰,这有损于面向对象编程的基本原则。当然,如果你的类只有3行,那么这并不重要,但是一旦你写了一些真正的应用程序并需要维护它,这种习惯会让你付出代价,所以我认为再写一个类的“痛苦”是值得的。 - MByD
从长远来看,这将是值得的。 - MByD

10

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

  • 避免意外的方法重写。我曾多次遇到这种情况,首先是当我给我的类int getX()int getY()方法时。尝试一下,你会发现一些不太有趣的异常行为。
  • 简化在使用Eclipse或NetBeans时可用的方法选项,仅限于您创建的那些方法。这实际上是我最喜欢的优点。
  • 将您的GUI针对创建JPanel而非JFrame,可将部署灵活性提高100倍。
  • 最重要的是,只公开需要公开的内容。

3
“将您的GUI调整为创建JPanels而不是JFrames...” 好的,但要小心不要陷入扩展面板的陷阱(除非实现自定义绘制行为等特殊情况)。 - Andrew Thompson

2
如果要扩展JFrame,我想修改/定制当前的Jframe类,以便子类可以使用这个定制实现。
如果在JFrame类中没有想要更改的内容,只需像您提供代码中第二个片段中那样使用现有的。通过使用,在JPanel中创建其他JComponent(例如按钮/标签)等,并创建Test对象并将JFrame contentPane设置为此对象。类似于:
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);
   }
...
}

0
面向对象设计的一个规则是:如果你不能继承(扩展)类,就不要去继承它们。
继承增加了程序的复杂性和联系,并且有可能引发新的错误。在你的情况下,没有任何理由去扩展该类。
只有当你需要访问受保护成员和/或获得多态行为(覆盖虚方法)时,才应该扩展类。

1
“..the classes you do not inherit their.” 他们的什么?你让我等待下一个单词.. ;) - Andrew Thompson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接