我有一个包含已声明为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”实例?
答案 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;
}
}