簡體   English   中英

兩個不同的變量獲得相同的值

[英]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

這是因為變量staticVarc1c2共享。 首先執行c1.staticVar = 4語句時, c1c2staticVar的值都是4。然后執行c2.staticVar = 8語句,將兩個類的staticVar的值改為8。

因此,在您的問題中,您必須使您的namepath變量為非靜態變量,以便為每個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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM