0

私はこのコードをオンラインで見つけ、私のアプリケーションで動作します。私はそれを追跡し、より完全に理解しようとしています。「add(new Surface());」の使用を説明するドキュメントが見つかりません。声明。私はそれが何をするかを理解していますが、ここに私が理解していないものがあります:

  • 「SomeObject」なしで add() メソッドはどのように機能しますか。その前に。add() メソッドは、それを含むオブジェクト (SampleAddMethod) 用であると想定しているようです。これがいつ、どのように有効であるかについてのドキュメントが見つかりません。
  • 「super.add(new Surface());」は機能するのに、「SampleAddMethod.add(new Surface());」はなぜ機能するのですか? 不合格?add() メソッドは Component から継承されているようで、SampleAddMethod は Component である JFrame です。
  • (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);
            }
        });
    }

}
4

1 に答える 1

1

「super.add(new Surface());」は機能するのに、「SampleAddMethod.add(new Surface());」はなぜ機能するのですか? 不合格?

add(Component)は のインスタンス メソッドであるためContainer、基本的に - であり、間接的SampleAddMethodに のサブクラスです。Containerしたがって、add呼び出しinitUIは暗黙的にthis.add(new Surface()). それが静的メソッドSampleAddMethod.addである場合にのみ機能するため、as を呼び出すことはできません。

(new Surface()) が「匿名クラス」を作成するのは正しいですか?

いいえ、コンストラクターを呼び出しているだけです。コードは次と同等です。

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

あなたが私たちに示したコードの唯一の匿名型は にあり、mainを実装する新しい匿名クラスを作成しますRunnable

于 2013-10-18T16:24:09.870 に答える