下面我们就定义了两个鸭子对象,并且将第一个鸭子对象赋值给第二个鸭子对象:
class Test
{
[STAThread]
static void Main(string [] args)
{
Duck myDuck1=new Duck();
Duck myDuck2=myDuck1;
myDuck1.SetName("小黄");
Console.WriteLine(myDuck2.GetName());
}
}
你如果尝试运行这个例子,显示结果是“小黄”,此时你会发现一个规律,那就是一旦我们这样赋值了,如上面我们将myDuck1赋值给myDuck2,那么这两个鸭子实际上是一个鸭子,你修改了其中任何一个鸭子的数据另外一个也跟着变化。为什么会这样,如果真的要解释原因,我们需要从对象的创建原理说起。我们说类创建类实例,此实例存放在内存中,对象变量只是保存该实例的引用,当两个对象互相赋值后,实际上这两个对象都引用了同一个类实例,因此才有上面规律。这里要理解引用的含义,比如我对我朋友牛强说“小强你好”和“阿强你好”含义相同,原因是小强和阿强都引用了牛强这个人。事实上,你如果了解C/C++中指针的概念,我就没有必要大费口舌了,因为C#中对象变量就是指针类型的变量,里面存放的是具体对象实例的地址,上面myDuck1的定义等效于C++中的:
Duck *myDuck1=new Duck();
类的成员访问
世间万物都有一定的存在或活动范围,比如你是中国人,那么你的活动范围大部分在中国,如果你要去国外那么你就得办个护照。再比如你是某个海洋博物馆的一只海豚,那么别人要来看你,至少要买张门票,世间万物的这种活动和访问范围的机制使世界可以有条不紊的运作。对象或对象成员属性和方法也需要通过某种机制来约束其访问,所以就有了访问修饰符这些东西,下面我们来讨论一下C#中的访问修饰符,C#中共有四个常用访问修饰符
访问修饰符 ,说明
public , 将类成员定义为公共访问,在程序的任何地方都可以访问,包括本类和本类外的其他类都可以访问
private ,将类成员定义为私有的,在本类中可以访问
protected ,将类成员定义为保护的,本类和类的子类可以访问
internal ,将类成员定义为内部的,本程序集任何地方可以访问
简单来说就是public关键字可以把类成员标识为“公共”,比如海洋博物馆的那只海豚就是公共的;private把成员标识为“私有”,比如你自己心底的秘密,只有你自己知道别人看不到摸不着;protected关键字意为“保护”,在没有子类的情况下,使用方式和private一样;internal修饰的成员在一个项目里相当于public关键字,因为一个项目默认就是一个程序集。上面出现的“子类”概念及“程序集”概念我们在后面会讲述,这里我们着重讲解这些访问修饰符的用法。
示例:
using System;
namespace Test
{
class Access
{
public int a=1;//公共访问类型
private int b=2;//私有访问类型
protected int c=3;//保护访问类型
internal int d=4;//内部访问类型
public int GetA()
{
return a;
}
private int GetB(){ return b;}
protected int GetC() { return c;}
internal int GetD() { return d; }
public int GetSum()
{
//在本类中a、b、c、d都可以访问
int r=a+b+c+d;
return r;
}
}
class Test
{
[STAThread]
static void Main(string [] args)
{
//在Test类定义并访问Access类成员
Access ac=new Access();
ac.a=4;//可以访问
ac.b=5;//不可以访问
ac.c=7;//不可以访问
ac.d=8;//可以访问
ac.GetA();//可以访问
ac.GetB();//不可以访问
ac.GetC();//不可以访问
ac.GetD();//可以访问
}
}
}
有的朋友可能记起来了,我们前面曾经出现几个例子,里面的成员属性和方法没有访问修饰符。如果没有访问修饰符,C#里默认是私有类型(private)的,这和C++语言中是一样的,和Java不一样,Java里不写访问修饰符被认为是默认型(有点像C#里的internal)。访问修饰符不仅可以修饰类成员,也可以修饰类(如public class Car)。