import java.awt.*;
public class Test{
    Frame f = new Frame();
    public static void main(String [] args){
        new Test().init();
    }
    
    public void init(){
        f.setSize(300,300);
        f.setVisible(true);
        Graphics g1 = f.getGraphics();
        Graphics g2 = f.getGraphics();
        if(g1==g2) {System.out.println("1");}
        else {System.out.println("0");}
    }
}     
 这段测试程序的打印结果是 0,也就是说f前后两次调用getGraphics()返回的g1和g2不是同一对象,这是为什么? 请帮忙研讨一下这问题.

解决方案 »

  1.   

    谁告诉你对象比较用==的....
    g1 g2是两个对象,用==比较肯定是false
    对象比较要用.equals()方法
    if(g1.equals(g2))
      

  2.   

    用==是比较两个对象的引用,如果引用都不等,那这两个对象就不是同一个对象了,equals()只是比较两个对象的内容是否相同。
      

  3.   

    对象的比较当然可以用==,只是要比较的对象的引用
    A a=new A();
    A b=a;
    那么a==b就是true
    但是要比较两个不同实例内容的话就必须要用equals了
    Graphics g1 = f.getGraphics();
    Graphics g2 = f.getGraphics();
    这两个不是同一个实例,已经不是同一个引用了,所以必须要用equals才能比较到内容
      

  4.   

    如果代码改为:
    f.getGraphics().setColor(Color.RED);和f.getGraphics().setColor(Color.YELLOW);
    则后面的Color.YELLOW与前面的Color.RED互不影响的,因为,这是分别在两个Graphics对象上设置颜色属性。我要问的是为什么同一个f调用两次getGraphics()返回的不是同一个Graphics对象,而产生了两个Graphics对象?
      

  5.   

    getGraphics()是获取Graphics 实例
    f就是个工厂类的实例了,专门给创建实例出来的
      

  6.   

    当然不是同一个对象
    Getgraphics返回的只是Graphics的副本
      

  7.   

    也就是说f每调用一次 getGraphics()方法,就相当于用new运算符创建一个Graphics对象!
      

  8.   

    对,楼主看来明白了
    就是相当于工厂创建Graphics对象了
      

  9.   

    好!实在是多谢各位兄弟的讨论,令本人又在Java的道路上前进了一个步