2017-06-05 44 views
3

我目前正在研究一个小型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

回答

11

MyFile类中,声明这些字段为static字段:

private static String path; 
private static String name; 

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

你还是宣布这些字段为实例字段为每个MyFile例如不同的值:

private String path; 
private String name; 
+0

太感谢你了 – Simagdo

+0

欢迎您:) – davidxxx

1

首先,你要了解static关键字:

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

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

private static String path; 
private static String name; 

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

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

}

+0

作为futher上面描述的静态变量没有attachement特定类的实例(对象),但你的varibales是类变量这样的功能你的MyFile类依赖于它们,因此静态访问是不行的。 –

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首先,staticVar值都c1c2是4.然后声明c2.staticVar = 8被执行的这两类staticVar值更改为8

所以你的问题,你必须使您的namepath变量非静态,以便为您的每个myFile实例提供不同的变量值。

我希望这会有所帮助。

-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")); 
相关问题