无法在课程外访问正确的课程对象

时间:2018-11-25 15:15:43

标签: java static

我有一个包含已声明为static volatile的类,因为我想让不同的类访问它的相同实例。当实例化该类时,我以为它将创建我的哈希映射的一个实例,但是显然它已经创建了2个实例。

第1类:

public class FlightMap {

private Flight flight;
private static volatile HashMap<String, Flight> flight_hm;

public FlightMap() {
    flight = new Flight();
    HashMap<String, Flight> flight_hm = new HashMap<>();
}

public int GetSize() {
    int size = flight_hm.size();
    return size;
}

第2类//调用类

public class GetFlightThread extends Thread {

@Override
public void run() {

    String ref;
    FlightMap fm = new FlightMap();
    int size=0;

    size = fm.GetSize();
}

当我在类1的调试器中查看时,有2个“ flight_hm”实例,一个实例的大小为零且为静态,另一个为null且为非静态。类2中的“ size”变量为null,因此显然类2正在访问非静态实例。如何只创建1个“ fm”实例?

2 个答案:

答案 0 :(得分:2)

HashMap<String, Flight> flight_hm = new HashMap<>();

↑这是声明一个局部变量并分配给该局部变量。此局部变量掩盖了您在课程级别上的static变量。

声明静态变量时,您需要在声明的同一行对其进行初始化,如下所示:

private static volatile HashMap<String, Flight> flight_hm = new HashMap<>();

答案 1 :(得分:0)

在类构造函数中声明的局部变量flight_hm和静态变量flight_hm是两个不同的变量。因此,这里发生的基本上是您声明了静态变量,但没有对其进行初始化,并且还在构造函数中声明并初始化了局部变量。考虑将this关键字作为将来的一种好习惯,以避免出现此类错误。

public class FlightMap {

    private Flight flight;
    private static volatile HashMap<String, Flight> flight_hm = new HashMap<>();

    public FlightMap() {
        flight = new Flight();
    }

    public int GetSize() {
        int size = this.flight_hm.size();
        return size;
    }
}