两个不同的变量得到相同的值

时间:2017-06-05 13:32:39

标签: java

我目前正在开发一个小型Java应用程序,但我遇到了一个问题。我创建了两个不同的变量,但是在运行代码之后,第一个变量获得的值与第二个变量相同。他们应该是不同的。

这是我的自定义文件类:

public class MyFile {

    private static String path;
    private static String name;

    private static final String FILE_SEPARATOR = "/";

    public MyFile(String path) {
        System.out.println(path);
        this.path = "";
        this.name = "";
        this.path = /*FILE_SEPARATOR*/path;
        String[] dirs = path.split(FILE_SEPARATOR);
        this.name = dirs[dirs.length - 1];
    }

    public static String getPath() {
        return path;
    }

    public static String getName() {
        return name;
    }

    public String toString() {
        return "Path: " + path + ", Name: " + name;
    }
}

我在这里使用变量:

MyFile modelFile = new MyFile("res\\model.dae");
MyFile textureFile = new MyFile("res\\diffuse.png");
System.out.println(modelFile.toString());
System.out.println(textureFile.toString());

输出如下:http://imgur.com/a/Nu3N6

5 个答案:

答案 0 :(得分:11)

MyFile课程中,您将这些字段声明为static字段:

private static String path;
private static String name;

因此,您可以为它们分配一个值,因为static字段在该类的所有实例之间共享。

您应该将这些字段声明为实例字段,以便为每个MyFile实例提供不同的值:

private String path;
private String name;

答案 1 :(得分:1)

  

首先,您想了解static关键字:

     
      
  • 属性和方法(类的成员)可以定义为static
  •   
  • static成员不属于单个对象。
  •   
  • static成员对所有实例(同一类的对象)都是通用的。
  •   
  • static成员是静态内存中的存储(每个人都可以使用的公共内存位置)。
  •   

因为两个成员变量是static。每个对象共享这两个变量的值(值对于每个对象都是通用的)。

private static String path;
private static String name;

删除两个变量中的static。然后,每个对象都将保存这些变量的单个值。

答案 2 :(得分:0)

定义实体类时,类变量显示为私有句点。除非您想静态访问这些变量,否则无需实例化类或使用getter和setter。如果你像上面那样使用getter和setter,并且明确地创建了你想要使用的类的实例,请确保你不要为类变量使用静态访问修饰符。

修改后的代码如下所示。     包StackOverflowProblemSets;

/ **  *由HACKER于05/06/2017创建。  * Two different variables getting same value  * / 公共课MyFile {

private  String path;
private  String name;

private static final String FILE_SEPARATOR = "/";

public MyFile(String path) {
    System.out.println(path);
    this.path = "";
    this.name = "";
    this.path = /*FILE_SEPARATOR*/path;
    String[] dirs = path.split(FILE_SEPARATOR);
    this.name = dirs[dirs.length - 1];
}

public  String getPath() {
    return path;
}

public  String getName() {
    return name;
}

public String toString() {
    return "Path: " + path + ", Name: " + name;
}

public static void main(String[] args) {
    MyFile modelFile = new MyFile("res\\model.dae");
    MyFile textureFile = new MyFile("res\\diffuse.png");
    System.out.println(modelFile.toString());
    System.out.println(textureFile.toString());
}

}

答案 3 :(得分:0)

您需要了解静态和局部变量。

类的静态变量是这样的变量,它们对于该类的所有实例都是通用的,并且由所有实例共享。例如。如果我有课:

public static class myClass{
    public static int staticVar;

    //Constructor
    public myClass(){
        staticVar = 0;
    }
 }

然后我在另一个类的main方法中有以下代码:

public static void main(String args[]){
    myClass c1, c2;
    c1 = new myClass();
    c2 = new myClass();
    c1.staticVar = 4;
    c2.staticVar = 8;
    System.out.println(c1.staticVar + " " + c2.staticVar);
}

然后我的输出将是:

8 8

这是因为变量staticVarc1c2共享。首先执行语句c1.staticVar = 4时, {strong> staticVarc1的{​​{1}}值为4.然后语句{{1}执行以将两个类的c2的值更改为8。

因此,在您的问题中,您必须使c2.staticVar = 8staticVar变量非静态,以便为每个name实例提供不同的变量值。

我希望这会有所帮助。

答案 4 :(得分:-1)

您的问题是第二个文件路径是第一个文件路径的重叠。所以,请检查以下代码:

    MyFile modelFile = new MyFile("res\\model.dae");
    MyFile textureFile = new MyFile("res\\diffuse.png");


    System.out.println(new MyFile("res\\model.dae"));
    System.out.println(new MyFile("res\\diffuse.png"));