繁体   English   中英

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

[英]Can't access correct class object outside of class

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

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

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

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

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

在类构造函数中声明的局部变量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;
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM