它在java中的'this'到底意味着什么?

时间:2012-12-20 06:59:17

标签: java

class A {

    void methodA {
        B b= new B();
        b.methodB();
        //point 1
    }

    private class B {
        void methodB(){
            //point 2
        }
    }
}

如果我使用系统在第1点和第2点同时打印this.toString(),它会给出相同的值。谁能告诉我为什么?那两个不应该给出不同的价值吗?

4 个答案:

答案 0 :(得分:2)

他们不同,试试这个:

public class Test {

    public static void main(String[] args) {
        new A().methodA();
    }
}

class A {

    void methodA() {
        B b= new B();
        b.methodB();
        //point 1
        System.out.println(this.toString());
    }

    private class B {

        void methodB(){
            //point 2
            System.out.println(this.toString());
        }
    }
}

答案 1 :(得分:1)

  

如果我使用系统out在第1点和第2点打印this.toString(),它会给出相同的值。

我不同意你的看法。

this总是引用java中的当前对象引用。

void methodA() {
    B b = new B();
    b.methodB();
    // point 1
    System.out.println(this.toString());
}

private class B {

    void methodB() {
        // point 2
        System.out.println(this.toString());
    }
}

结果 -
样品$ B @ 9304b1
样品@ 190d11

从内部类方法看,它打印Sample$B@9304b1,其中Sample是基类,B是内部类和哈希码。其中class方法使用@和hashcode打印类名。

两个哈希码都不同,因此两个对象都不同。所以这指的是不同的对象实例。

答案 2 :(得分:1)

简单的答案是第1点和第2点打印不同的东西......除非你重载了toString()方法:

您的计划:

class A {

    void methodA() {
        B b= new B();
        b.methodB();
        System.err.println("point 1 - " + this.toString());
    }

    private class B {
        void methodB(){
            System.err.println("point 2 - " + this.toString());
        }
    }

    public static void main(String[] args) {
        new A().methodA();
    }
}

运行时打印出来。

point 2 - A$B@58c3d9ac
point 1 - A@2207d8bb

事实上,输出明确告诉我们this在第1点和第2点意味着不同的事情。在第1点,this指的是A的实例。在第2点,this指的是A.B的实例。

答案 3 :(得分:0)

嗯,这是toString()方法的行为。您正在访问引用该班级当前实例的this关键字。
正如visal_aim在这种情况下发布的答案 point1 this关键字将引用A类的实例,而point 2它将引用B类的实例。
您得到相同的答案,因为this的点都是object的类型,并且将返回相同的字符串。 (直到你重写了基础对象类的toString()方法)。