1、面向对象核心概念
(1)类是抽象,对象是实例,new一个对象会分配一块堆空间,对象指向该空间的地址,将对象赋值给另一个对象,只是将地址赋给它,指向的是同一块空间。
e.g.
class Car { public string name; public void showName() { Console.WriteLine("这是一辆" + name); } } class Program { static void Main(string[] args) { Car benz = new Car(); benz.name = "奔驰"; benz.showName(); Car c200 = benz; c200.name = "C200"; benz.showName(); Console.ReadKey(); } }
输出:
因为c200赋值为benz时,只是将地址赋给了c200,它们指向的是同一块地址。
当没有指针指向这块堆空间时,就成为垃圾,将会被回收。
(注:C#中的string类型也是引用类型,但不会出现类似上面的情况——即string a = "1";string b = a;b = "2";//a还是1,这是因为运算符重载的结果,当b的值发生变化时,会重新为它创建一块新的堆空间,这样a和b就指向了不同的地址,实现通常语义下的字符串。
延伸:为什么说C#中的字符串对象一旦被初始化,就不能再改变这个对象的值?因为初始化后,会在堆空间中分配一块区域存放这个对象,string变量只是指向这个地址的引用,当改变这个变量时,系统会重新在堆空间中开辟一块区域放新的字符串,这个变量就指向这个新的地址,原来那个字符串对象如果没有引用指向它,将会成为垃圾被回收)
(2)面向对象的作用:a.更真实的模拟现实;b.增加代码复用性。
2、封装
封装不想展示的变量
3、继承
子类会完成继承父类的属性和方法,包括父类是private的成员,但子类不能访问这些private成员。(private:只有自己能访问;protected:派生类也能访问;internal:当前程序集能访问<注意不是同一个namespace,参考:https://www.cnblogs.com/liuww/p/5335003.html;MSDN:https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/keywords/internal>;public:谁都能访问)
protected internal |