Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/384.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 多实例can';t使用相同的变量,变量不变_Java - Fatal编程技术网

Java 多实例can';t使用相同的变量,变量不变

Java 多实例can';t使用相同的变量,变量不变,java,Java,我不太确定这有什么问题,我确信这与范围有关。昨天我遇到了一个问题,由于我多次调用该方法,一个字段将自身初始化回零,使得一个类字段修复了这个问题,因为它保留了它的值,而不管调用任何方法多少次 现在我遇到了相反的问题,我需要重置字段,因为另一个对象需要使用它(这可能/不好的做法吗?) 代码如下: public class TestDigitalCamera { static String brand; static double megaPixels; static dou

我不太确定这有什么问题,我确信这与范围有关。昨天我遇到了一个问题,由于我多次调用该方法,一个字段将自身初始化回零,使得一个类字段修复了这个问题,因为它保留了它的值,而不管调用任何方法多少次

现在我遇到了相反的问题,我需要重置字段,因为另一个对象需要使用它(这可能/不好的做法吗?)

代码如下:

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?最好的方法是什么

您有以下代码:

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");
}

您应该像这样重构代码:

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);


}
如果在
main
方法中声明两个
DigitalCamera
实例,如下所示

DigitalCamera camera = getInformation(camera);
这样就不需要单独的静态变量


我强烈建议您阅读Java教程中关于类和实例成员的部分:

我会这样编写您的类

公共类数码相机{

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();
}

}

你知道displayInfo总是使用camera,所以它从不使用camera2吗?天哪…我感觉像是这样一个工具lol。在不复制代码的情况下,让displayInfo同时输出两者的最佳方法是什么?让displayInfo接受一个参数:displayInfo(数码相机)是的,我假设,感谢您清除了这个问题。您为什么不能将
displayInfo
作为
DigitalCamera
类的实例方法?这样,您就可以简单地执行
camera.displayInfo()
camera2.displayInfo()
。有趣的是,您这样做的原因是什么?是不是这样,您可以随时调用该方法,并始终拥有新的摄影机对象?而不是创建xxx数量的实例?是的,只要您想创建新的摄影机对象,就可以调用此方法。而且您创建的实例变量属于camera对象,所以您不应该创建为TestCamera类的实例变量。如果你想让它变得更好,摆脱Scanner类,创建json/xml/properties文件,列出你想要显示和读取的相机属性,并为每个属性创建相机对象。我会读到的,我主要是从我的书中学习。事实上,这经常会让您阅读java文档,让您习惯于非常好地引用它。但是我想你的书提到的是Java API文档,而不是Java教程。看看我的代码,这看起来很愚蠢。我把变量名绑定到参数上,因为我使用的是setter,所以实际上什么都不做……我想我可以直接执行一个标准方法,请求用户输入来初始化变量