黑马程序员技术交流社区

标题: 为什么变量已经用private修饰了, 另一个类中还是能访问? [打印本页]

作者: 葛杨杨    时间: 2013-5-16 04:20
标题: 为什么变量已经用private修饰了, 另一个类中还是能访问?
如下, 一开始以为是设置属性成功了, 后来发现把属性注释掉了以后还是能运行, 按理说private的修饰过应该另一个类访问不了才对, 属性注释掉以后程序应该不能运行才是. 到底哪里出了问题?
  1. [code]
  2. using System;
  3. using System.Collections.Generic;
  4. using System.Linq;
  5. using System.Text;

  6. namespace 类
  7. {
  8.     public class Person
  9.     {
  10.         private string name="葛杨杨";   //注意访问关键字是private的,必须声明为属性, 通过属性才能访问到
  11.       
  12.         //定义一个只读属性变量,只含有get方法
  13.        /* public string Name
  14.         {
  15.             get
  16.             {
  17.                 return name;
  18.             }
  19.             
  20.         }
  21.         */

  22.         public void SayHello()
  23.         {
  24.             Console.WriteLine("我叫{0}",name);
  25.         }
  26.     }

  27.     class Class1
  28.     {
  29.         static void Main(string[] args)
  30.         {

  31.             Person geyangPerson = new Person();

  32.             geyangPerson.SayHello();
  33.             Console.ReadKey();
  34.         }
  35.     }
  36. }
  37. [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
  1. 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