为什么下面程序输出的结果是
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();

}
}

解决方案 »

  1.   

    System.out.print("\n"+name+"\n"); 
    这句话是在a1.func2()里面执行的,输出的也是a1的name...关于new的时候的内存分配堆栈之类的东西,建议你去看看马士兵老师的视频,一看,全明白!
      

  2.   

    a2 is not available out of method fun2().
      

  3.   


    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} 

    分分....
      

  4.   

    把 string name 改成stringBuffer name 不知道会怎么样
      

  5.   

    作用域的问题,你说的那个不是还是原来的最初的a1的name?和你最初打印的那个name有什么不同?
      

  6.   

    4楼的过程很清楚了,我按马老师的方法画了下:创建局部变量a2的时候,在堆内存中新分配了一个空间放a2的成员变量和方法,但当执行完a2.func1();后,也就是打印了func1 of a2is calling 后,局部变量a2消失,它所指向的成员变量和方法等待垃圾回收系统收回,因此现在的name依然是a1.name,也就是依然是a1...
      

  7.   

    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(); //这一句的执行对象是新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();   }