黑马程序员技术交流社区
标题:
为什么变量已经用private修饰了, 另一个类中还是能访问?
[打印本页]
作者:
葛杨杨
时间:
2013-5-16 04:20
标题:
为什么变量已经用private修饰了, 另一个类中还是能访问?
如下, 一开始以为是设置属性成功了, 后来发现把属性注释掉了以后还是能运行, 按理说private的修饰过应该另一个类访问不了才对, 属性注释掉以后程序应该不能运行才是. 到底哪里出了问题?
[code]
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace 类
{
public class Person
{
private string name="葛杨杨"; //注意访问关键字是private的,必须声明为属性, 通过属性才能访问到
//定义一个只读属性变量,只含有get方法
/* public string Name
{
get
{
return name;
}
}
*/
public void SayHello()
{
Console.WriteLine("我叫{0}",name);
}
}
class Class1
{
static void Main(string[] args)
{
Person geyangPerson = new Person();
geyangPerson.SayHello();
Console.ReadKey();
}
}
}
[code]
复制代码
作者:
$love
时间:
2013-5-16 06:50
你main方法中没有访问私有变量name啊,你只不过调用了SayHello();
方法,之后通过这个方法去调用name的,这样子方法和私有变量是在同一个类中啊 ,丝毫不会有影响?
目前你只要记住 geyangPerson.name才会报错就可以了!也就是对象直接访问私有变量是不可以的。
作者:
许庭洲
时间:
2013-5-16 06:51
在属性的访问声明中:只有get访问器,表明属性的值是只读的,不能改写。
作者:
郑丹丹1990
时间:
2013-5-16 07:33
private string name="葛杨杨";
复制代码
这个name,在 public class Person{}内均可呗访问。
同理SayHello()自然可以访问name了。
限制读写属性在用get;set;限制。
作者:
liuelxiwd
时间:
2013-5-16 08:12
亲,你new完Person对象的缘故,new对象之后,它就能访问该类中所有类型的成员方法和属性,所以可以直接访问name;但是在其他类中,如果不new对象,而是直接访问private方法,显然是找不到它在哪儿的。
作者:
周琪
时间:
2013-5-18 11:15
您这种情况是定义了一个私有的name,但是你又在类内部定义了公有的方法来访问私有字段name(我私下里把这叫做间接访问,可能没人这么说。但我感觉这样容易理解),这是可以的。
然后你声明类对象的时候,这个对象就指向了类所在的堆,所以才会有类中的方法字段等。
当然,你可以通过反射来直接获得私有的变量。这时不需要用类中public的方法来访问都行。
这是你只要在你的主程序中加上以下代码,就来可以访问私有字段了 //即获得你程序中的 葛杨杨
Type t=typeof(Person);
FieldInfo m = t.GetField("name",BindingFlags.NonPublic|BindingFlags.Instance);
object obj = Activator.CreateInstance(t);
Console.WriteLine(m.GetValue(obj));
作者:
吃肉的小浣熊
时间:
2013-5-18 13:16
在main方法中你是通过 geyangPerson.SayHello();调用方法,跟本没有直接使用 private name私有字段。所以跟本不会报错。
但是如果你把 geyangPerson.SayHello();改成了 geyangPerson.name;这一定是会报错。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2