【问题标题】:Object Creation in java and finalize在java中创建对象并完成
【发布时间】:2014-06-09 03:10:51
【问题描述】:
class FDemo { 
    int x; 

    FDemo(int i) { 
        x = i; 
    } 

    protected void finalize() { 
        System.out.println("Finalizing " + x); 
    } 

    void generator(int i) { 
        FDemo o = new FDemo(i); 
        System.out.println("Creat obj No: " + x); // this line
    } 

} 

class Finalize { 
    public static void main(String args[]) { 
        int count; 

        FDemo ob = new FDemo(0); 

        for(count=1; count < 100000; count++) 
            ob.generator(count); 
        } 
    }
}

在我评论的那一行,x的值总是显示0(对象ob中x的值),为什么不显示对象o的值??我知道如果我使用 o.x,我将获得对象 o 中 x 的值。但是仍然在这段代码中为什么它显示了abject ob而不是object o的值??

【问题讨论】:

  • Erm,你实例化一个新的FDemo 然后丢弃它而不做任何事情。您到底希望发生什么?
  • 你还没有告诉它在o 中查找x。如果你写System.out.println("Create obj No: " + o.x);,你会得到你所期望的,但x 本身是指当前对象中的x,而不是你刚刚创建的对象中的x。
  • 如果您将 'int x' 更改为 'static int x' 它应该可以工作,但您的方法是错误的。如果您要从创建新实例的对象创建 setter 方法中更改值。
  • @franki3xe 这将为他提供他正在寻找的输出,但它会更改他所有 FDemo 对象的 x 值。因为他在构造函数中设置了这个,我假设他希望每个对象都不同。

标签: java core finalize


【解决方案1】:

如果您想在刚刚创建的 FDemo 中引用 x,您应该添加一个 getX() 函数并调用它而不是 x,就像 David Wallace 所说的那样。 (我更喜欢使用 getter 而不是 .variable)。

将此添加到您的课程中:

public int getX(){
    return x;
}

并将有问题的行更改为:

System.out.println("Creat obj No: " + o.getX());

这应该可以解决它。附带说明一下,明确声明您的变量和方法是私有的、公共的还是受保护的被认为是一种很好的做法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-12-25
    • 1970-01-01
    • 2018-07-15
    • 2011-08-08
    • 1970-01-01
    • 2019-09-15
    • 1970-01-01
    相关资源
    最近更新 更多