Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/376.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Java中删除其他方法中的对象?_Java - Fatal编程技术网

如何在Java中删除其他方法中的对象?

如何在Java中删除其他方法中的对象?,java,Java,我想知道如何删除其他方法中的对象,例如,我想删除deleteObject方法中的dog对象,但它只是删除对象的当前引用! 有没有解决办法 public class Main { public static void main(String[] args) { Dog dog = new Dog("Max"); deleteObject(dog); System.out.println(dog.toString()); //it still


我想知道如何删除其他方法中的对象,例如,我想删除
deleteObject
方法中的
dog
对象,但它只是删除对象的当前引用! 有没有解决办法

public class Main {
    public static void main(String[] args) {
        Dog dog = new Dog("Max");
        deleteObject(dog);
        System.out.println(dog.toString()); //it still exists! I want to remove it
    }

    public static void deleteObject(Dog dog) {
          dog = null; //I want to remove this object but it deletes just this method's reference
    }
}

class Dog {
    private String name;

    public Dog(String name) {
        this.name=name;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

在java中,对象由GC进行垃圾收集(用您的话来说是删除的)。当不存在对该对象的活动引用时,它是自动过程。此外,您不能100%确定,当不存在引用时,它已被删除,只是请求而已

当对象没有更多引用时,该对象被“删除”(或者更具体地说,成为垃圾收集器可以删除的对象)。在您的示例中,有两个引用指向同一对象(主方法中的dog引用和deleteObject方法中的dog引用)。当您在deleteObject中将dog设置为null时,main中的dog引用仍指向该对象

public class Main {
    static Dog dog = null;
    public static void main(String[] args) {

        dog = new Dog("Max");
        dog = deleteObject(dog); //really unnecessary

        if(dog==null)
        {
            System.out.println("I AM DEAD!");
        }
        else
        {
            System.out.println(dog.toString());
        }
    }

    public static Dog deleteObject(Dog dog) {
        dog = null;

        return dog;
    }
}


class Dog {
    private String name;

    public Dog(String name) {
        this.name=name;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}
您只需在main中将dog引用设置为null,这将使对象可用于垃圾收集。或者使dog引用成为一个类变量,即在任何方法之外声明,那么main和delteObject可以使用同一个dog引用


为什么仍要删除该对象?在方法结束时,所有本地引用都将超出范围,并且对象将变得可用于垃圾收集。

我有一个解决方案,但对于您的问题来说,它可能太过分了;它涉及到弱引用:

public class Pound{
   public static WeakReference<Dog> adopt(String name){
      Dog newDog = new Dog(name);
      dogList.add(newDog);
      return new WeakReference<Dog>(newDog);
   }

   public static void sacrifice(WeakReference<Dog> dogRef){
      Dog sadPuppy = dogRef.get();
      dogList.remove(sadPuppy);
   }

   private static List<Dog> dogList = new ArrayList<Dog>();

   public class Dog{
      public String getName(){
         return this.name;
      }

      private Dog(String name){
         this.name = name;
      }

      private String name;
   }
}
在你的主要方法中

此外,您必须在使用get()的代码的每一部分中检查空值,并且需要一些方法来不断清理包含死weakreference的ReferenceQueue


取决于您实际打算做什么,这可能太多,您最好使用另一种解决方案,或者完全忘记这一点,但至少这是我能想到的唯一可行的方法。

将dog作为全局变量,它会很好地工作。但是如果你需要更好地使用对象,我建议你可以使用单例模式。你说的“删除”是什么意思释放内存?全局变量是静态变量?如果我尝试静态狗;它仍然不起作用。我尝试使用signletone模式,但在我的应用程序中,这不是最好的决定,因为它使用多线程。我希望main方法中的dog变量是null@gennad:如果保留任何未指定引用的内容,垃圾收集器将按照@org.life.java的说明将其删除。它将无法工作…我无法在静态方法中访问类变量我可以只使用静态变量,但有两个参考,鉴于我们对他试图做的事情知之甚少,而且他可能还需要学习很多,我认为现在建议像Singleton这样具体、危险且经常被误用的“解决方案”是不明智的。@Bart我同意@gennad代码已更新。你能分享一下你想要达到的目标吗?
sacrifice(WeakReference<Dog> dog)
class Main{
   public static void main(String ... args){
      WeakReference<Dog> max = Pound.adopt("Max");

      //This line prints "Max"
      System.out.println(max.get().getName());
      meanMethod(max);

      //Max is now dead, so you get a NullPointerException
      System.out.println(max.get.getName());
   }

   public static void meanMethod(WeakReference<Dog> dog){
      Pound.sacrifice(dog);
      //From this point, dog is no more ='(
   }
}
Dog strongDog = weakReferenceToDog.get();