class A {
void methodA {
B b= new B();
b.methodB();
//point 1
}
private class B {
void methodB(){
//point 2
}
}
}
如果我使用系统在第1点和第2点同时打印this.toString()
,它会给出相同的值。谁能告诉我为什么?那两个不应该给出不同的价值吗?
答案 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()方法)。