为什么下面程序输出的结果是
a1
func1 of a2is calling
a1为什么不是
a1
func1 of a2is calling
a2
class A
{
String name;
public A(String x)
{
name=x;
}
public void func1()
{
System.out.print("func1 of "+name+"is calling");
}
public void func2()
{
System.out.print(name+"\n");
A a2=new A("a2");
a2.func1();
System.out.print("\n"+name+"\n");
}
}
class TestA
{
public static void main(String args [])
{
A a1=new A("a1");
a1.func2();
}
}
a1
func1 of a2is calling
a1为什么不是
a1
func1 of a2is calling
a2
class A
{
String name;
public A(String x)
{
name=x;
}
public void func1()
{
System.out.print("func1 of "+name+"is calling");
}
public void func2()
{
System.out.print(name+"\n");
A a2=new A("a2");
a2.func1();
System.out.print("\n"+name+"\n");
}
}
class TestA
{
public static void main(String args [])
{
A a1=new A("a1");
a1.func2();
}
}
这句话是在a1.func2()里面执行的,输出的也是a1的name...关于new的时候的内存分配堆栈之类的东西,建议你去看看马士兵老师的视频,一看,全明白!
class A
{
String name;
public A(String x)
{
name=x; //111111111 //333333333
}
public void func1() //44444444
{
System.out.print("func1 of "+name+"is calling");
}
public void func2() //22222222,执行下面
{
System.out.print(name+"\n"); //name还是11111111的那个.
A a2=new A("a2"); //执行,跳到3333333
a2.func1(); //调用func1的方法,跳到444444
System.out.print("\n"+name+"\n");
}
}
class TestA
{
public static void main(String args [])
{
A a1=new A("a1"); //跳到11111111
a1.func2(); //执行.跳到22222222}
}
分分....
String name;
public A(String x) {
name=x;
}
public void func1() {
System.out.print("func1 of "+name+"is calling");
}
public void func2() {
System.out.print(name+"\n");
A a2=new A("a2");
a2.func1(); //这一句的执行对象是新new出来的a2,由构造函数可获得name为a2.
System.out.print("\n"+name+"\n"); //执行这一句的对象是a1。所以name应该是a1。
}
} public class T1 {
public static void main(String args []) {
A a1=new A("a1");
a1.func2(); }
}