我目前正在开发一个小型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());
答案 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
这是因为变量staticVar
由c1
和c2
共享。首先执行语句c1.staticVar = 4
时, {strong> staticVar
和c1
的{{1}}值为4.然后语句{{1}执行以将两个类的c2
的值更改为8。
因此,在您的问题中,您必须使c2.staticVar = 8
和staticVar
变量非静态,以便为每个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"));