我写了几年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上是不合法的吗?
答案 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 Swing和JFrame的Javadoc。
答案 2 :(得分:2)
您需要查看此行
public class MainClass extends JFrame
你从JFrame类中获得了很多额外的功能,包括设置Graphic上下文。
请注意, paint()不是构造函数,它是类的一个方法,它是由于框架设置为可见而调用的。