【问题标题】:Getting Rid of an Object's Reference摆脱对象的引用
【发布时间】:2015-03-11 13:36:58
【问题描述】:

我想在我的测试器类中删除每个对象的引用,但我遇到了错误。我正在使用的方法已在注释中提供给我,但不确定它们是否正确。

任何帮助将不胜感激:)

这是我的代码:

public class Bicycle {

// Instance Variables
private String name; // Owner's name
private int age; // Owner's age
private char gender; // Owner's gender
private static int instanceCounter = 0;

// Default Constructor - doesn't take in values
public Bicycle() {
    this("Not Given", 0, 'U');
    instanceCounter++;
}

// Parameter constructor
public Bicycle(String name, int age, char gender) {
    this.name = name;
    this.age = age;
    this.gender = gender;
    instanceCounter++;
}

// Getter and setters
public String getName() {
    return name;
}
public void setName(String name) {
    this.name = name;
}

public int getAge() {
    return age;
}
public void setAge(int age) {
    this.age = age;
}

public char getGender() {
    return gender;
}
public void setGender(char gender) {
    this.gender = gender;
}

public int countInstances(){
    return instanceCounter;
}
}

测试人员:

public class BicycleTester {

  public static void main(String args[]){


    // Instance one
    Bicycle bicycle1 = new Bicycle(null, 0, 'U');
    bicycle1.setName("John");
    System.out.println("Name: " +bicycle1.getName());
    bicycle1.setAge(18);
    System.out.println("Age: " +bicycle1.getAge());
    bicycle1.setGender('M');
    System.out.println("Gender: " +bicycle1.getGender());

    System.out.println("");

    // Instance two
    Bicycle bicycle2 = new Bicycle(null, 0, 'U');
    bicycle2.setName("Mary");
    System.out.println("Name: " +bicycle2.getName());
    bicycle2.setAge(23);
    System.out.println("Age: " +bicycle2.getAge());
    bicycle2.setGender('F');
    System.out.println("Gender: " +bicycle2.getGender());

    System.out.println("");

    // Instance three
    Bicycle bicycle3 = new Bicycle(null, 0, 'U');
    bicycle3.setName("Billy");
    System.out.println("Name: " +bicycle3.getName());
    bicycle3.setAge(15);
    System.out.println("Age: " +bicycle3.getAge());
    bicycle3.setGender('M');
    System.out.println("Gender: " +bicycle3.getGender());

    System.out.println("");

    // Three ways to get rid of object's reference
    void go() {
        Life bicycle1 = new Life();
    }

    Life bicycle2 = new Life();
    bicycle2 = new Life();

    Life bicycle3 = new Life();
    bicycle3 = null;

}

}

【问题讨论】:

  • 请发布错误以及“摆脱对象引用”的含义。你的意思是你想让它有资格进行垃圾收集吗?
  • @MarcusWidegren 是的,这就是我想要的

标签: java variables object reference instance


【解决方案1】:

好的,女士,让我们再次回顾一下基础知识。

我们将从 ObjectAKA instancereference 之间的区别开始。

Life bicycle2 = new Life();

这里,bicycle2 是一个引用,它将位于堆栈上。引用指向由调用new Life() 创建的instance。实例将在 Heap

你无法摆脱对象的引用。您可以摆脱一个实例。 只有一种方法可以做到这一点。

  1. 将指向实例的引用设置为nullto some other instance 例如:Life bicycle2 = new Life(); bicycle2 = null;// the instance created above will be eligible for GC

或者你也可以这样做:

Life bicycle2 = new Life(); bicycle2 = new Life();// 上面创建的生命实例将被丢弃。

请注意:引用是范围相关的,一旦它超出范围,它将无法访问。我不认为你在这里谈论这个。

【讨论】:

    【解决方案2】:

    在您的无参数构造函数的情况下,您将 instanceCounter 递增两次 - 一次是在您使用参数调用另一个构造函数时,另一次是在无参数构造函数中完成时。

    您也不会在任何地方减少计数,因此如果您使用它作为跟踪内存中有多少类实例的方法,那么您的计数将被取消。

    【讨论】:

      猜你喜欢
      • 2010-10-30
      • 1970-01-01
      • 1970-01-01
      • 2016-05-02
      • 1970-01-01
      • 1970-01-01
      • 2011-10-01
      • 1970-01-01
      • 2011-01-31
      相关资源
      最近更新 更多