为什么这个方法不使用对象的任何属性?

时间:2010-03-12 10:51:57

标签: java oop this jframe

Here我找到了这段代码:

import java.awt.*;
import javax.swing.*;


public class FunWithPanels extends JFrame {

    public static void main(String[] args) {
        FunWithPanels frame = new FunWithPanels();
        frame.doSomething();
    }

    void doSomething() {
        Container c = getContentPane();

        JPanel p1 = new JPanel();
        p1.setLayout(new BorderLayout());
        p1.add(new JButton("A"), BorderLayout.NORTH);
        p1.add(new JButton("B"), BorderLayout.WEST);

        JPanel p2 = new JPanel();
        p2.setLayout(new GridLayout(3, 2));
        p2.add(new JButton("F"));
        p2.add(new JButton("G"));
        p2.add(new JButton("H"));
        p2.add(new JButton("I"));
        p2.add(new JButton("J"));
        p2.add(new JButton("K"));

        JPanel p3 = new JPanel();
        p3.setLayout(new BoxLayout(p3, BoxLayout.Y_AXIS));
        p3.add(new JButton("L"));
        p3.add(new JButton("M"));
        p3.add(new JButton("N"));
        p3.add(new JButton("O"));
        p3.add(new JButton("P"));

        c.setLayout(new BorderLayout());
        c.add(p1, BorderLayout.CENTER);
        c.add(p2, BorderLayout.SOUTH);
        c.add(p3, BorderLayout.EAST);

        pack();
        setVisible(true);
    }
}

我不明白“doSomething”如何使用“frame”是JFrame类的一个实例。我不清楚,因为在“doSomething”方法的代码中没有引用“this”。

增加:

也许这是相关的。在这段代码中:

import java.awt.*;
 import java.applet.Applet;
 public class ButtonGrid extends Applet {
     public void init() {
         setLayout(new GridLayout(3,2));
         add(new Button("1"));
         add(new Button("2"));
         add(new Button("3"));
         add(new Button("4"));
         add(new Button("5"));
         add(new Button("6"));
     }
 }

在“init”方法中,我们使用方法“setLayout”和“add”,我们不将它们绑定到特定对象(例如objectName.setLayout(...))。那是为什么?

5 个答案:

答案 0 :(得分:3)

虽然未使用this,但该方法经常使用JFrame方法,特别是在获取内容窗格的方法的第一行Container c = getContentPane();

使用this关键字可以使示例更加清晰,但您不需要它。

该示例可以重写为:

import java.awt.*;
import javax.swing.*;


public class FunWithPanels extends JFrame {

    public static void main(String[] args) {
        FunWithPanels frame = new FunWithPanels();
        frame.doSomething();
    }

    void doSomething() {
        Container c = this.getContentPane();

        // .. snip unaltered code

        this.pack();
        this.setVisible(true);
    }
}

这完全等效。

答案 1 :(得分:2)

这是因为this隐含在编译器的搜索路径中。编译器将按以下顺序查找变量:

  1. 当前块中的局部变量
  2. 外部块中的局部变量
  3. 方法参数
  4. 当前班级中的一个字段(即相对于this
  5. 父类中的字段

答案 2 :(得分:1)

如果我没有误解某些事情,答案是微不足道的:

编译器不需要this.限定符来检测何时使用该类的成员。显式使用this.的唯一需要是存在名称冲突,例如

public MyClass {
    private Foo foo;
    MyClass(Foo foo) {
        this.foo = foo;
    }
}

更新:显然我确实误解了这个问题......虽然我显然并不孤单。

无论如何,doSomething()调用getContentPane() JFrame的方法,以及来自pack()父类的setVisible()JFrameWindow。但是,这本身并不会使FunWithPanels扩展JFrame,因为所有这些方法都是公开的,任何人都可以访问。

我相信作者认为FunWithPanelsJFrame的一种特殊类型,这就是它成为子类的原因。这种方式FunWithPanels可以在需要通用JFrame的任何地方使用。有关详细说明,请参阅Liskov Substitution Principle。 (注意:这可能是也可能不是良好的课堂设计,但在不了解背景的情况下我不能说太多。)

答案 3 :(得分:1)

  

我不明白“doSomething”是怎么回事   使用“框架”是一个事实   JFrame类的实例

因为FunWithPanels extends JFrame,您在FunWithPanels中定义的每个方法都将在FunWithPanels的实例上调用。

答案 4 :(得分:1)

此行中隐含使用this

Container c = getContentPane();

getContentPane()相当于this.getContentPane()