下面这段代码就可以,感觉很离奇。怎么解释呢?
class Person
    {
        private String name;
        private int age;
        public Person(String name, int age)
        {
            this.name = name;
            this.age = age;
        }
        public void change(Person p)
        {
            p.name = "李四";
            p.age = 50;
        }
        public void print()
        {
            Console.WriteLine("姓名:" + this.name);
            Console.WriteLine("年龄:" + this.age);
        }
    }    
    public class Demo
    {
        public static void Main()
        {
            Person p = new Person("张三", 30);
            p.change(p);
            p.print();            Person p2 = new Person("Jack", 20);
            p.change(p2);
            p2.print();
            
            Console.Read();
        }
    }

解决方案 »

  1.   

    p.change(p2);public void change(Person p)
    {
        p.name = "李四";
        p.age = 50;
    }这一句,执行的是P的方法
    但是方法的参数传入一个 p2 的实例方法内部其实是    p2.name = "李四";
        p2.age = 50;p2 的实例调用它的私有对象,自然是合情合理的
      

  2.   

    private是私有字段,只能自己类内部使用,不能被其他类访问的,这个例子表面看起来好像被对象访问了,但是它访问的地方并不在其它类中,chang函数把本身这个类的实例引用传到它自己类的运行域里了,这时候访问域就在类内部了,自然可以访问私有成员我自己的理解,总结一句话,private本质是一个访问域的问题,只要在这个类的域内,就能访问这个私有成员,并不是说是它的对象就不能访问它了,更何况对象是引用类型,实参传进来只是它自己的一个引用!最通俗的总结就是,不是对象能不能访问的问题,是在哪里访问的问题!
      

  3.   

    问:什么情况下可以用 对象名.私有字段名 来访问私有字段?答:在申明private成员的类或结构体内可以用 对象名.私有字段名 来访问私有字段 
      

  4.   

    p.change(p);的话,可以把p理解为this吗?那,p.change(p2);是在p的内部用p2去访问私有字段,也可以,怎么解释呢?
      

  5.   


     public Person(String name, int age)
    {
          this.name = name;
          this.age = age;
    }Person有自己的公有带参数的构造函数,所以能访问,如果去掉就肯定不行了
      

  6.   


     public void change(Person p)
            {
                p.name = "李四";
                p.age = 50;
            }
    首先change的方法带的参数就是一个Person的对象
    所以上面的p.change(p);p.change(p2);
    红色的都只是一个传一个对象而已,这个对象已经为name,age指定了值的
      

  7.   

    这样当然可以了,跟set ,get 差不多呀
      

  8.   

            public void change(Person p)
            {
                p.name = "李四";
                p.age = 50;
            }
    在2008下好像编译不过
      

  9.   


    p.change(p2)是在p的内部吗?你还是没理解访问域是怎么回事,你在编写Person这个类的时候,传进来的person参数是在Person类定义里面操作的,所以对象p可以访问私有成员,和传进来是那个对象无关的,只要是penson类型就行