[英]Two different variables getting same value
我目前正在開發一個小型 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
在MyFile
類中,您將這些字段聲明為static
字段:
private static String path;
private static String name;
因此,您可以為它們分配一個值,因為static
字段在類的所有實例之間共享。
您應該將這些字段聲明為實例字段,以便為每個MyFile
實例具有不同的值:
private String path;
private String name;
首先您想了解
static
關鍵字:
- 屬性和方法(類的成員)可以定義為
static
。static
成員不屬於單個對象。static
成員對所有實例(同一類的對象)都是通用的。static
成員存儲在靜態內存中(每個人都可以使用的公共內存位置)。
因為兩個成員變量都是static
的。 每個對象共享這兩個變量的值(每個對象的值都是通用的)。
private static String path;
private static String name;
刪除兩個變量中的static
。 然后每個對象都將為這些變量保存一個單獨的值。
定義實體類時,類變量顯示為私有周期。 除非您想靜態訪問這些變量,例如無需實例化類或使用 getter 和 setter。 如果您像上面那樣使用 getter 和 setter,並且清楚地創建了您要使用的類的實例,請確保您不要對類變量使用靜態訪問修飾符。
修改后的代碼如下。 包 StackOverflowProblemSets;
/** * 由 HACKER 於 2017 年 5 月 6 日創建。 * 兩個不同的變量獲得相同的值*/ public class 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());
}
}
您需要了解靜態和局部變量。
類的靜態變量是該類的所有實例共有且由所有實例共享的變量。 例如,如果我有一堂課:
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
語句時, c1
和c2
的staticVar
的值都是4。然后執行c2.staticVar = 8
語句,將兩個類的staticVar
的值改為8。
因此,在您的問題中,您必須使您的name
和path
變量為非靜態變量,以便為每個myFile
實例提供不同的變量值。
我希望這有幫助。
你的問題是第二個文件路徑是第一個文件路徑的重疊。 因此,請檢查此代碼:
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"));
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.