java中的对象创建和最终确定 类FDemo{ int x; FDemo(int i){ x=i; } 受保护的void finalize(){ System.out.println(“最终确定”+x); } 无效生成器(inti){ FDemo o=新的FDemo(i); System.out.println(“创建对象编号:+x);//此行 } } 类{ 公共静态void main(字符串args[]){ 整数计数; FDemo ob=新FDemo(0); 用于(计数=1;计数

java中的对象创建和最终确定 类FDemo{ int x; FDemo(int i){ x=i; } 受保护的void finalize(){ System.out.println(“最终确定”+x); } 无效生成器(inti){ FDemo o=新的FDemo(i); System.out.println(“创建对象编号:+x);//此行 } } 类{ 公共静态void main(字符串args[]){ 整数计数; FDemo ob=新FDemo(0); 用于(计数=1;计数,java,core,finalize,Java,Core,Finalize,在我评论的那行中,x的值总是显示为0(对象ob中x的值),为什么不显示对象o的值??我知道如果我使用o.x,我将得到对象o中x的值。但是在这段代码中,为什么它会显示abject ob而不是object o的值呢?如果你想在刚刚创建的FDemo中引用x,你应该添加一个getX()函数,并调用它,而不是像大卫·华莱士说的那样调用x。(我更喜欢使用getter而不是.variable) 将此添加到您的类: class FDemo { int x; FDemo(int i) {

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

如果你想在刚刚创建的FDemo中引用x,你应该添加一个
getX()
函数,并调用它,而不是像大卫·华莱士说的那样调用x。(我更喜欢使用getter而不是.variable)

将此添加到您的类:

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); 
        } 
    }
}
并将您的问题行更改为:

public int getX(){
    return x;
}

这应该可以解决问题。作为旁注,明确声明变量和方法是私有的、公共的还是受保护的被认为是一种好的做法。

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