java - 寻找 "add(new Surface());"的解释(文档?)

标签 java object

我在网上找到了这段代码,它适用于我的应用程序。我正在努力追溯并更彻底地理解它。我没有找到任何解释“add(new Surface());”用法的文档陈述。我明白它的作用,但我不明白的是:

  • 如果没有“SomeObject”,add() 方法如何工作。在它的前面。似乎假设 add() 方法适用于包含它的对象 (SampleAddMethod)。我找不到任何关于如何或何时有效的文档。
  • 为什么“super.add(new Surface()); 有效,但“”SampleAddMethod.add(new Surface());”有效失败?看来 add() 方法是从 Component 继承的,而 SampleAddMethod 是一个 JFrame,它是一个 Component。
  • (new Surface()) 创建了一个“匿名类”,我的说法正确吗?

(下面是示例代码)

package testMainMethod;

import java.awt.Graphics;
import java.awt.Graphics2D;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

class Surface extends JPanel {

    private void doDrawing(Graphics g, int x) {
        double xd = (double) x;
        Graphics2D g2d = (Graphics2D) g;

        // Code to draw line image goes here
    }

    @Override
    public void paintComponent(Graphics g) {

        for (int i = 0; i < 512; i++) {
            // super.paintComponent(g); // this erases each line
            doDrawing(g, i);
        }
    }
}

public class SampleAddMethod extends JFrame {

    public SampleAddMethod() {

        initUI();
    }

    private void initUI() {

        setTitle("Lines");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        add(new Surface());

        setSize(650, 350);
        setLocationRelativeTo(null);
    }

    public static void main(String[] args) {

        SwingUtilities.invokeLater(new Runnable() {

            @Override
            public void run() {

                SampleAddMethod lines = new SampleAddMethod();
                lines.setVisible(true);
            }
        });
    }

}

最佳答案

Why does "super.add(new Surface()); work, but ""SampleAddMethod.add(new Surface());" fail?

因为add(Component)基本上是 Container 上的实例方法 - 并且 SampleAddMethodContainer 的间接子类。因此,initUI 中的 add 调用隐式是 this.add(new Surface())。您不能将其称为 SampleAddMethod.add,因为只有当它是静态方法时,它才有效。

Am I correct that (new Surface()) creates an "anonymous class"?

没有。它只是调用一个构造函数。该代码相当于:

Surface surface = new Surface();
add(surface);

您向我们展示的代码中唯一的匿名类型位于 main 中,它在其中创建了一个实现 Runnable 的新匿名类。

关于java - 寻找 "add(new Surface());"的解释(文档?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19454434/

相关文章:

java - 将字符串列表转换为字符串数组 - (String[])list.toArray() 和 list.toArray(new String[0]) 之间的区别

java - OkHttp 对请求启用/禁用 gzip 压缩

javascript - 读取Javascript对象

Java初始化对象

javascript - 在 JavaScript 中扩展具有多个属性的对象

c++ - C++ 模板类中的“const”方法

java - 如何根据用户输入将数组中最大的元素放在末尾,最小的元素放在开头?

java - 在 Java 中执行 javascript 代码的更快方法(sdk1.4)

java - Java 7 中过滤和返回对象的优化方式

Javascript 设置变量和对象以及正确的语法(调试控制台)