从java中的另一个类访问静态变量

Posted

技术标签:

【中文标题】从java中的另一个类访问静态变量【英文标题】:Accesing static variable from another class in java 【发布时间】:2012-05-04 00:08:48 【问题描述】:

我在多线程服务器中将队列实现为链表。我想从另一个班级访问这个队列。两个类都在同一个包中。我尝试将此队列设为公共静态并通过 getter 访问它,但没有成功有人可以告诉我确切的问题是什么。

这是我的代码: 队列声明:

public static Queue<Request> q=new ConcurrentLinkedQueue<Request>();

public static void setQ(Queue<Request> q) 
        Connection.q = q;
    

    public static Queue<Request> getQ() 
        return q;
    

访问队列:

Queue<Request> queue=new ConcurrentLinkedQueue<Request>(); 
queue=Connection.getQ();

在连接线程中为队列添加值

q.add(r);

【问题讨论】:

请贴出你代码的相关部分 您遇到的实际问题是什么?解释“没有成功”。是编译问题还是运行时问题? 注意在多线程程序中使用非线程安全队列。如果您还没有,请查看BlockingQueue,它可能会对您有所帮助。 如果您的问题已经得到解答,或者不再有效,请“打勾”以选择最合适的答案,以便所有人都知道问题已得到解决。谢谢。 【参考方案1】:

您可以使用ClassName.memberName 表示法直接访问另一个类的public static 成员:

public class Foo 
    public static String bar = "hi there";


public class Thing 
    public static void main(String[] args) 
        System.out.println(Foo.bar); // "hi there"
   

public static 数据成员通常不是一个好主意(除非他们有 final),但如果你需要一个,这就是你的做法。

【讨论】:

嗨 T.J.请问在这种情况下,Foo本身是否成为Foo.bar中的一个对象?我来自 javascript,在使用 Math.PI 时,每个人都说 Math 是一个数学对象,但在 Java 中,我遇到的人只是说“你可以通过类名访问静态变量”,所以我很困惑。谢谢! @Hang - Foo 不是 Java 中的对象,不是。 (如您所知,它在 JavaScript 中将是一个对象——特别是构造函数。)类是 Java 中的一等概念。 一个对象代表类FooClass 的一个实例,您可以通过Foo.class 访问),但Foo 本身并不是一个对象。 感谢您的回复 T.J.!那么如果 Foo.bar 既不是对象也不是类,我们应该怎样称呼 Foo 呢?似乎很难在任何来源中明确找到这个答案...... @Hang - 这只是类名。 JLS 中的更多内容:docs.oracle.com/javase/specs/jls/se9/html/jls-6.html 哦,明白了!我在 6.1 中看到它。声明。我感谢您的帮助! :D【参考方案2】:

你应该可以直接访问,或者使用静态getter方法...

如果这是你的队列类...

public class Queue 
    public static LinkedList myList = new LinkedList();

    public static ListedList getMyList()
        return myList;
    

然后您可以通过调用Queue.myListQueue.getMyList() 访问您的列表——两者都会做同样的事情。使用 getter 方法的好处是您可以控制对列表的访问,例如通过创建方法 synchronized,防止对列表的调用无序。

【讨论】:

我试过这两件事。但我让队列空了。以下是我的代码的 sn-ps。在服务器类中,我正在创建连接类对象并在新线程中创建新连接。在连接中,我将队列声明为: 能否将您的代码粘贴到您的问题中,以便正确格式化。 队列声明:public static Queue q=new ConcurrentLinkedQueue();公共静态 void setQ(Queue q) Connection.q = q; public static Queue getQ() return q; 在线程的运行方法中向队列添加值:getQ().add(r);并以这种方式访问​​队列: Queue queue=new ConcurrentLinkedQueue(); queue=Connection.getQ();

以上是关于从java中的另一个类访问静态变量的主要内容,如果未能解决你的问题,请参考以下文章

类概念

Java中的静态类

Java中的静态和枚举

java中的内部类

实例局部静态变量(java)

java开发中所有静态变态变量写一个类