【问题标题】:Are values returned by static method are static?静态方法返回的值是静态的吗?
【发布时间】:2025-12-23 18:10:06
【问题描述】:

请考虑此代码

public class Utilities
{
     public static MyClass GetMyClass()
     {
          MyClass cls = new MyClass();
          return cls;
     }
}

这个静态方法会在每次调用时返回一个新的MyClass 实例吗?或者它会一遍又一遍地返回对同一个实例的引用?

【问题讨论】:

  • 显式地每次都会创建一个新实例...
  • 静态是唯一的方法,即方法内部的所有内容(内容)都表示为静态并且不与任何对象关联。但是方法的内容每次都会创建一个新的对象并返回给你。
  • 这是你应该能够自己测试的东西(如果你真的认为它需要测试的话)。在MyClass的构造函数中添加一个System.out.println("hello"),调用你的静态方法5次,看看hello被打印了多少次。
  • @JBNizet 或只是System.out.println(GetMyClass() == GetMyClass())
  • 确实如此。有很多方法可以同时进行实验和学习。

标签: java methods static


【解决方案1】:

new 关键字在调用该方法的所有过程中创建一个新实例,并将该实例返回给调用者。 static 关键字告诉编译器该方法在类级别本身可用。调用者可以使用返回的实例。

【讨论】:

    【解决方案2】:

    哈哈哈哈哈哈哈哈 声明一个方法 static 意味着它是一个类方法,可以在没有实例的情况下在类上调用(并且无法访问实例成员,因为上下文中没有要使用的对象 - 没有 this)。

    看看下面的代码。预期输出:

    [1] Different
    [2] Same
    

    如果你想让一个变量拥有类的生命周期并且每次都返回相同的对象,还要在类中声明变量为static

    public static String getThing(){
        String r=new String("ABC");//Created every time the method is invoked.
        return r;
    }
    
    private static String sr=new String("ABC");//Static member - one for the whole class.
    
    public static String getStaticThing(){
        return sr;
    }
    
    public static void main (String[] args) throws java.lang.Exception
    {
        String thing1=getThing();
        String thing2=getThing();
        if(thing1==thing2){
            System.out.println("[1] Same");
        }else{
            System.out.println("[1] Different");
        }
        
        String thing1s=getStaticThing();
        String thing2s=getStaticThing();
        if(thing1s==thing2s){
            System.out.println("[2] Same");
        }else{
            System.out.println("[2] Different");
        }
    }
    

    【讨论】:

      【解决方案3】:

      这个静态方法会在每次调用时返回一个新的MyClass 实例吗?

      是的。您显式创建了一个返回 MyClass 的新实例。

      【讨论】:

        【解决方案4】:

        您每次调用new MyClass() 时都会创建一个新对象,因此您可以预期它会返回一个新实例。您可以通过调用此方法两次并比较结果来检查这一点。

        【讨论】:

          【解决方案5】:

          它既不是静态的也不是动态的。这只是一个例子。这取决于开发人员和对象的使用情况。

          每次调用静态方法时,都会创建一个新实例。

          【讨论】: