2013-08-30 86 views
1

我不太清楚这有什么问题,我相信它与范围有关。昨天我遇到了一个问题,即一个字段将自己初始化为零,这是因为我不止一次地回顾了该方法,因此无论调用哪种方法的时间,都会使该类字段保持其值,从而解决该问题。多个实例不能使用相同的变量,变量不能改变

现在我有相反的问题,我需要现场复位,因为另一个对象需要使用它(这是可能的/糟糕的做法?)

下面是代码:

public class TestDigitalCamera { 

    static String brand; 
    static double megaPixels; 
    static double price; 

    //create 2 camera instances with the values of the variables tied to the arguments. 
    static DigitalCamera camera = new DigitalCamera(brand, megaPixels); 
    static DigitalCamera camera2 = new DigitalCamera(brand, megaPixels); 


    public static void main(String[] args) { 

     //no idea what this technique is called, need to look back but I know what it does 
     //I could use a for loop and reuse the same object over and over(would that even work anyway?) but the task says 
     //that i require 4 instances, ofc I am just working with 2 atm for simplicity 
     camera = getInformation(camera); 
     displayInfo(); 
     camera2 = getInformation(camera2); 
     displayInfo(); 


    } 

    //it basically runs this for the camera instance...right? lol 
    public static DigitalCamera getInformation(DigitalCamera dc){ 
     Scanner userInput = new Scanner(System.in); 

     //self explanatory 
     System.out.println("Enter brand: "); 
     brand = userInput.next(); 
     System.out.println("Enter Mega Pixels: "); 
     megaPixels = userInput.nextDouble(); 

     //I have another class setup with getters/setters for this, which get used in the next method 
     dc.setBrand(brand); 
     dc.setMegaPixels(megaPixels); 
     return dc;  

    } 

    public static void displayInfo(){ 

     //users the getters to pull the values 
     //the price is calculated using an if statement 
     System.out.println("Brand: " + camera.getBrand() + "\n" 
       + "Megapixels : " + camera.getMegaPixels() + "\n" 
         + "Price : $" + camera.getPrice() + "\n"); 
    } 

} 

是这是由于范围?该变量对任何和所有对象都是可用的,但它只能用于1?什么是最好的方法来解决这个问题?

+4

您是否知道displayInfo始终使用相机,因此它从不使用camera2? – MrP

+0

OMG ...我觉得像这样的工具哈哈。什么是最好的方式让它输出而不必复制代码? – Gibbo

+0

让displayInfo带一个参数:displayInfo(DigitalCamera camera) – MrP

回答

2

你有这样的代码:

camera = getInformation(camera); 
displayInfo(); 
camera2 = getInformation(camera2); 
displayInfo(); 

这里你的方法displayInfo()是不是真的采取任何参数,并从camera对象打印信息这两个时间的叫法。即使您在getInformation的第二个呼叫中获得camera2对象的参考,您并不是真的在打印它。

你可以声明displayInfo这样的:

public static void displayInfo(DigitalCamera camera) { 
    //users the getters to pull the values 
    //the price is calculated using an if statement 
    System.out.println("Brand: " + camera.getBrand() + "\n" 
     + "Megapixels : " + camera.getMegaPixels() + "\n" 
     + "Price : $" + camera.getPrice() + "\n"); 
} 
+0

编辑:你回答我问,谢谢 – Gibbo

+0

很高兴你的问题得到解决。 – anubhava

0

你应该重构你的代码是这样的:

public static void displayInfo(DigitalCamera camera){ 

    //users the getters to pull the values 
    //the price is calculated using an if statement 
    System.out.println("Brand: " + camera.getBrand() + "\n" 
      + "Megapixels : " + camera.getMegaPixels() + "\n" 
        + "Price : $" + camera.getPrice() + "\n"); 
} 

然后在main方法:

public static void main(String[] args) { 

    camera = getInformation(camera); 
    displayInfo(camera); 
    camera2 = getInformation(camera2); 
    displayInfo(camera2); 


} 

如果你声明您在中的两个DigitalCamera实例这样的方法

DigitalCamera camera = getInformation(camera); 

那么就不需要单独的静态变量了。

我会stronlgy建议你阅读类和实例成员在Java教程部分:http://docs.oracle.com/javase/tutorial/java/javaOO/classvars.html

+0

我会读,我一直主要从我的书中学习。实际上,你每隔一段时间就会发送一次java文档,以便你习惯于参考它。 – Gibbo

+0

非常好。但我认为你的书引用了Java API文档,这与Java教程不会混淆。 –

+0

哎呀,你是对的,完全不同。 – Gibbo

0

我会写你的班级这样

公共类TestDigitalCamera {

public static test_display(){ 
    DigitalCamera camera = getCamera(); 
    System.out.println("Brand: " + camera.getBrand() + "\n" 
      + "Megapixels : " + camera.getMegaPixels() + "\n" 
      + "Price : $" + camera.getPrice() + "\n"); 

} 

public static getCamera(){ 
    Scanner userInput = new Scanner(System.in); 

    //self explanatory 
    System.out.println("Enter brand: "); 
    brand = userInput.next(); 
    System.out.println("Enter Mega Pixels: "); 
    megaPixels = userInput.nextDouble(); 

    //I have another class setup with getters/setters for this, which get used in the next method 
    DigitalCamera dc = new DigitalCamera(); 
    dc.setBrand(brand); 
    dc.setMegaPixels(megaPixels); 
    return dc; 
} 

public static void main(String[] args) { 
    test_displainfo(); 
} 

}

+0

有趣的是,你背后的原因是什么这样做?它是否可以随时调用方法并始终拥有新的相机对象?而不是创建xxx个实例? – Gibbo

+0

是的,只要你想创建新的Camera对象,你就可以调用这个方法。并且您创建的实例变量也属于相机对象,因此您不应将其创建为TestCamera类的实例变量。如果你想使它更好,摆脱扫描仪类,并创建你想要显示的摄像头属性的json/xml /属性文件列表,并读取该文件并为每个属性创建相机对象。 – Nu2Overflow