什么情况下可以用 对象名.私有字段名 来访问私有字段?

崔鹏飞 2009-03-01 09:34:00
下面这段代码就可以,感觉很离奇。怎么解释呢?
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();
}
}
...全文
192 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
崔鹏飞 2009-03-16
  • 打赏
  • 举报
回复
key:访问域
黑哥 2009-03-02
  • 打赏
  • 举报
回复
understand???
jiezi316 2009-03-02
  • 打赏
  • 举报
回复
学习了
崔鹏飞 2009-03-01
  • 打赏
  • 举报
回复
可以啊,我就是用的vs2008[Quote=引用 10 楼 lianshaohua 的回复:]
public void change(Person p)
{
p.name = "李四";
p.age = 50;
}
在2008下好像编译不过。。。。。。
[/Quote]
ztenv 2009-03-01
  • 打赏
  • 举报
回复
public void change(Person p)
{
p.name = "李四";
p.age = 50;
}
在2008下好像编译不过。。。。。。
iwxiaot 2009-03-01
  • 打赏
  • 举报
回复
这样当然可以了,跟set ,get 差不多呀
wangping_li 2009-03-01
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 cuipengfei1 的回复:]
p.change(p);的话,可以把p理解为this吗?

那,p.change(p2);是在p的内部用p2去访问私有字段,也可以,怎么解释呢?
[/Quote]

public void change(Person p)
{
p.name = "李四";
p.age = 50;
}
首先change的方法带的参数就是一个Person的对象
所以上面的p.change(p);p.change(p2);
红色的都只是一个传一个对象而已,这个对象已经为name,age指定了值的
wangping_li 2009-03-01
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 cuipengfei1 的回复:]
p.change(p);的话,可以把p理解为this吗?

那,p.change(p2);是在p的内部用p2去访问私有字段,也可以,怎么解释呢?
[/Quote]

public Person(String name, int age)
{
this.name = name;
this.age = age;
}

Person有自己的公有带参数的构造函数,所以能访问,如果去掉就肯定不行了
崔鹏飞 2009-03-01
  • 打赏
  • 举报
回复
p.change(p);的话,可以把p理解为this吗?

那,p.change(p2);是在p的内部用p2去访问私有字段,也可以,怎么解释呢?
csc_hanker 2009-03-01
  • 打赏
  • 举报
回复
问:什么情况下可以用 对象名.私有字段名 来访问私有字段?

答:在申明private成员的类或结构体内可以用 对象名.私有字段名 来访问私有字段
csc_hanker 2009-03-01
  • 打赏
  • 举报
回复
private是私有字段,只能自己类内部使用,不能被其他类访问的,这个例子表面看起来好像被对象访问了,但是它访问的地方并不在其它类中,chang函数把本身这个类的实例引用传到它自己类的运行域里了,这时候访问域就在类内部了,自然可以访问私有成员

我自己的理解,总结一句话,private本质是一个访问域的问题,只要在这个类的域内,就能访问这个私有成员,并不是说是它的对象就不能访问它了,更何况对象是引用类型,实参传进来只是它自己的一个引用!

最通俗的总结就是,不是对象能不能访问的问题,是在哪里访问的问题!

  • 打赏
  • 举报
回复
代码范围在类内,即使从外面传进来,也可以访问的。
JaggerLee 2009-03-01
  • 打赏
  • 举报
回复
p.change(p2);

public void change(Person p)
{
p.name = "李四";
p.age = 50;
}

这一句,执行的是P的方法
但是方法的参数传入一个 p2 的实例

方法内部其实是

p2.name = "李四";
p2.age = 50;

p2 的实例调用它的私有对象,自然是合情合理的
崔鹏飞 2009-03-01
  • 打赏
  • 举报
回复
同类的实例可以互相访问私有成员?
龙宜坡 2009-03-01
  • 打赏
  • 举报
回复
觉得这种做法有点倒行逆施的感觉!

这样弄出来的代码是故意让别人看不懂的!


个人看法!
csc_hanker 2009-03-01
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 cuipengfei1 的回复:]
p.change(p);的话,可以把p理解为this吗?

那,p.change(p2);是在p的内部用p2去访问私有字段,也可以,怎么解释呢?
[/Quote]

p.change(p2)是在p的内部吗?

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

110,536

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧