Java静态方法

Java静态方法,java,static,Java,Static,我是java新手,我想知道从静态方法返回对象是否可以? 由于静态方法对类进行操作。。。我在这里有点困惑。 另外,如果多个线程试图调用它呢 class Test { public static test(List<String> input) { List<List<String>> res = new ... ; // some code return res; } } 类测试 { 公共静态测试

我是java新手,我想知道从静态方法返回对象是否可以? 由于静态方法对类进行操作。。。我在这里有点困惑。 另外,如果多个线程试图调用它呢

class Test
{
    public static test(List<String> input) {
        List<List<String>> res = new ... ;
        // some code
        return res;
    }
}
类测试
{
公共静态测试(列表输入){
列表res=新;
//一些代码
返回res;
}
}

从静态方法返回对象没有问题

您的示例也适用于多线程。每个线程将在堆上创建一个不同的对象,并返回对它的引用-因此没有问题,该对象是不共享的

静态方法不在类上操作。它们只是绑定到类而不是该类的成员。这意味着它们无权访问类的任何非静态成员。除此之外,它们与非静态方法没有太大区别


如果您的静态方法访问(写入或读取)了静态成员,那么它可能在多个线程中存在问题,除非您使用锁定。

静态方法与类相关联,如果您从不同的线程调用它,那么演示的代码不会有任何问题,因为
res
在声明方法时将是线程本地的

例如:

 import java.util.List;

    class Test
    {
        public static List test(List<String> input) {
            List<List<String>> res = new ... ;
            // some code
            return res;
        }
    }
import java.util.List;
课堂测试
{
公共静态列表测试(列表输入){
列表res=新;
//一些代码
返回res;
}
}

所以,这个方法将返回list,对于静态方法,您不需要创建该类的对象,基本上,只要您只使用局部变量,这是可以的。因此,您的代码示例将在每次调用该方法时创建一个新的
列表。这是不是一个优雅的设计是一个不同的故事


如果使用状态,例如某些成员字段,则情况就不同了。多个线程可能会调用您的方法,并且它们在相同的对象上工作。

静态方法只能访问静态对象

所以,如果您将在静态方法中使用任何对象,它也将是静态的,因此所有线程都具有相同的值


所以你可以很容易地做到这一点。

我同意,这个方法非常好


不过要小心,该方法可能是线程安全的,但您传入的列表却不是。例如,当另一个线程插入字符串时,如果在列表上迭代,可能会遇到一些问题。字符串是不可变的,当然是线程安全的。

要基本了解静态变量/方法与实例变量/方法的区别,请阅读或搜索类似的变量/方法。而且,它的答案应该有助于解释什么时候方法是线程安全的(您的方法不会修改线程之间可以共享的任何数据,所以它是完全安全的)

对于您的代码,您的方法签名应该如下所示:

public static List<List<String>> test(List<String> input) {...}
公共静态列表测试(列表输入){…}

因为您将返回字符串列表。

谢谢大家的回复。由于方法声明中缺少返回类型,因此上述代码将不会编译。不,线程有其私有堆栈,对象将存储在其中,而不是由线程共享的堆空间中。所有对象都在堆上,男:)只有上面的参考文献可以参考,这篇文章有几个例子可以说明这一点