-3
class A {

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

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

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

4

4 回答 4

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());
        }
    }
}
于 2012-12-20T07:02:38.427 回答
1

如果我使用系统输出在第 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 是内部类和哈希码。其中类方法使用@和哈希码打印类名。

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

于 2012-12-20T07:03:29.240 回答
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

于 2012-12-20T07:21:23.080 回答
0

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

于 2012-12-20T07:11:49.160 回答