J2SE问题,构造函数自动运行?

时间:2009-11-23 11:17:17

标签: java

我写了几年C#并开始学习java, 今天我看到一个样本很奇怪,这在C#中是不可能发生的。
http://www.java2s.com/Tutorial/Java/0261__2D-Graphics/Drawrectangles.htm

public class MainClass extends JFrame {

  public static void main(String[] a){
    MainClass f = new MainClass();
    f.setSize(300,300);
    f.setVisible(true);
  }


  public void paint(Graphics g) {
    g.drawRect(10, 10, 60, 50);
    g.fillRect(100, 10, 60, 50);
    g.drawRoundRect(190, 10, 60, 50, 15, 15);
    g.fillRoundRect(70, 90, 140, 100, 30, 40);
  }
}

构造函数paint()将在main()上触发,参数 - “g”没有初始化任何东西,它是java上的隐藏功能但是在OOP上是不合法的吗?

3 个答案:

答案 0 :(得分:4)

这里有什么违法行为?您正在扩展JFrame并且只覆盖方法paint()(方法,而不是构造函数)。休息是所有继承的行为。

如果您查看JFrame及其祖先的源代码,您会看到在setVisibile()的来电时会调用paint()。并且还提供了正确的Graphics对象。


行为与此迷你示例中的行为相同。这将在命令行上输出“Bar”。这是有道理的。您覆盖在runMe()中继承的Foo构造函数中调用的Bar方法,因为您没有使用/提供自己的方法覆盖它。

public class Test {
    public static void main(String args[]) {
        new Bar();
    }
}

public class Foo {
    public Foo() { runMe(); }
    public void runMe() { System.out.println("Foo"); }
}

public class Bar extends Foo {
    public void runMe() { System.out.println("Bar");}
}

答案 1 :(得分:3)

paint()不是构造函数。 paint()是一个方法,当需要绘制你创建的框架时,它将由Swing调用。

尝试阅读tutorial on SwingJFrame的Javadoc。

答案 2 :(得分:2)

您需要查看此行

public class MainClass extends JFrame

你从JFrame类中获得了很多额外的功能,包括设置Graphic上下文。

请注意, paint()不是构造函数,它是类的一个方法,它是由于框架设置为可见而调用的。