2014-03-06 55 views
1

我已经创建了类GConveyor的2个对象。我想在选择它们时获取有关这些对象的一些数据,但都返回相同的信息。谢谢您的帮助!为什么两个Java对象返回相同的数据

/* 
* File: DragObjects.java 
*/ 
import acm.graphics.*; 
import acm.program.*; 
import java.awt.event.*; 

public class DragObjects extends GraphicsProgram { 
private static final long serialVersionUID = 1L; 
// Initializes the program 
public void init() { 
    //adding a few test objects 
    GConveyor conv = new GConveyor(50, 44, 120); 
    add(conv); 
    GConveyor conv2 = new GConveyor(30, 24, 60); 
    add(conv2); 

    addMouseListeners(); 
    addKeyListeners(); 
    } 

// Called on mouse press to record the coordinates of the click */ 
public void mousePressed(MouseEvent e) { 
    // GPoint has X and Y coordinate 
    last = new GPoint(e.getPoint()); 
    gobj = getElementAt(last); 
    //looking at stuff so to understand 
    getObjectData(); 
} 


public void getObjectData(){ 
    //looking at stuff so to understand 
    System.out.println(gobj.toString());  

    GContainer obLength = gobj.getParent(); 
    System.out.println(obLength.toString());  

    int d = ((GCompound) gobj).getElementCount(); 
    System.out.println("Element per GConveyor:"+ d ); 

    System.out.println("hashcode:" +gobj.hashCode()); 

    int y = this.getElementCount(); 
    System.out.println("this Element Count:"+ y ); 

    int a = GConveyor.getBF();  
    System.out.println("bf:" + a ); 
    int b = GConveyor.getEF();  
    System.out.println("ef:" + b ); 
    int h = GConveyor.getLength();  
    System.out.println("length:" + h ); 
    int c = ((GConveyor) gobj).getLength();  
    System.out.println("length:" + c );  
} 



// Called on mouse drag to reposition the object 
public void mouseDragged(MouseEvent e) { 
    if (gobj != null) { 
     gobj.move(e.getX() - last.getX(), e.getY() - last.getY()); 
     last = new GPoint(e.getPoint()); 
     } } 

/* Private instance variables */ 
private GObject gobj; 
/* The object being dragged */ 
private GPoint last; 

} 

,以下是我GConveyor类

/* 
* 
* File: GConveyor.java * This class implements a conveyor as a GCompound. 
*/ 

import java.awt.Color; 
import acm.graphics.*; 

public class GConveyor extends GCompound { 
/* Constants specifying frame size*/ 
private static final int FRAME_WIDTH = 2; 
private static int myBf; 
private static int myEf; 
private static int myLength; 

private static final double scale = 10; 
/* Private instance variables */ 
private GRect outer; 
private GRect chain_box; 
private GRect effWidth; 
private GPolygon pti; 
private GPolygon pto; 

public GConveyor(int bf, int ef, int length) { 
outer = new GRect(length, ((FRAME_WIDTH *2) + bf)); 
chain_box = new GRect(length , bf - ef); 
effWidth = new GRect(length, bf); 
pti = createAnchor(scale); 
pto = createAnchor(scale); 
add(outer, 0 , 0); 
add(chain_box, 0 , FRAME_WIDTH); 
add(effWidth, 0 , FRAME_WIDTH); 
add(pti, 0 , FRAME_WIDTH + (bf-ef) + (ef/2)); 
add(pto, length , FRAME_WIDTH + (bf-ef) + (ef/2)); 

myBf = bf; 
myEf = ef; 
myLength = length; 

} 

public static int getBF(){ 
return myBf; 
} 
public static int getEF(){ 
return myEf; 
} 
public static int getLength(){ 
return myLength; 
} 


/* Creates a hex for the Anchor */ 
private GPolygon createAnchor(double scale) { 
GPolygon poly = new GPolygon(); 
poly.addVertex(-0.25*scale, 0.433*scale); 
poly.addVertex(-0.5*scale, 0.0*scale); 
poly.addVertex(-0.25*scale, -0.433*scale); 
poly.addVertex(0.25*scale, -0.433*scale); 
poly.addVertex(0.5*scale, 0.0*scale); 
poly.addVertex(0.25*scale, 0.433*scale); 
poly.setFilled(true); 
poly.setFillColor(Color.BLUE); 
return poly; 
} 

public String toString(){ 
return("" +myBf+ +myEf+ +myLength+ ""); 

} 

} 
+0

GConveyor不会是静态类吗? –

+0

我有一些静态方法 – user3386112

回答

2

这些变量是静态的,所以这些单个变量(和它们的奇异值)将用于您的GConveyor类的所有实例。这就是为什么你得到相同的信息。

private static final int FRAME_WIDTH = 2; 
private static int myBf; 
private static int myEf; 
private static int myLength; 

消除static关键字,你不需要他们(其中每个实例需要唯一的信息),并且你应该不错。

+1

对于'FRAME_WIDTH','static'可能是可以的。但不是其他人。 – ajb

+0

是的。真正。将'FRAME_WIDTH'留为静态。 – aliteralmind

1

toString()吐出myBfmyEfmyLength,所有这些都是静态的。这意味着它们是类本身的属性(of GConveyer),而不是类的实例(convconv2),所以当您为其中的任何一个调用实例的setter方法时,您正在修改相同的变量。

你有2个实例,但只有1级,所以你只有1套的变量,而不是2

不要让他们静若你希望他们归因于每个实例,而不是整个班级。

2

myBF,myEFmyLengthGConveyor中被声明为static。这意味着这些整数中只有一个是整数,并且每个整数都由全部共享。当您调用GConveyor构造函数创建第二个实例时,构造函数将设置这些静态字段,这些静态字段将影响为第一个实例返回的值。

相关问题