C#基础解析之 Ⅴ【封装】
园友们大家好,今天继续和大家一起探讨一下C#语言中的面向对象特性之一---封装
在C#语言中面向对象有三个特性封装、继承、多态。我们首先来简单的理解一下面向对象,所谓面向对象就是应用程序开发中的技巧和概念,主要就是一种设计的思路,简称OOP技术,面向对象的编程语言可以使得复杂的工作条理变的清晰,编写起来也就容易些,它还具有重用性、灵活性和扩展性。但是,说实话如果具体说面向对象还真说不清楚,就好比你问我什么是数学。
No.1 面向对象的基础核心是类和对象。所谓类就是具有相同属性和行为的对象的集合。比如说:导演是个类,演员是个类,观众也是一个类,他们都有相同的属性和行为,都是抽象类,都是指一群人。所谓对象就是一切皆为对象,比如说:一台电脑、一个手机、一个苹果等等都是对象。对象描述了一个物体的特性,抽象一个实际的物体或一个方法。
为了加深印象,我给大家画了一张图:
在对象中它的访问修饰符有四个:public公有权限、internal程序集保护权限、protected保护权限、private私有权限。类的成员也包括三个:字段、属性、方法。字段是保存类的信息数据,大部分字段是私有的。属性是为了保护私有字段,是公有的,其中属性包括两个访问器一个是只读属性get访问器和只写属性set访问器。方法是类的行为,就是类要做的事情。
No.2 简单的了解了面向对象,接下来我们就来看一下方法的定义,所谓方法就是行为,也就是要干什么事情,对于方法的定义也没有具体的说法,比较广泛,一般就是指为了达到某种目的为了获得某种东西而采取的一种手段或者行为方式。
我们来下一个简单的方法调用的例子:
创建类:
1 class Regisseur //演员类
2 {
3 string name;
4 public string Name
5 {
6 get { return name; }
7 set { name = value; }
8 }
9 //选择电影名称的方法,参数movieName是电影名称
10 public void SelectMovieName(string movieName)
11 {
12 Console.WriteLine("导演:" + name + "拍摄" + movieName + "精彩电影");
13 }
14 }
在Main方法中调用类的方法:
1 class Program
2 {
3 static void Main(string[] args)
4 {
5 Regisseur r = new Regisseur();//实例化对象
6 r.Name = "徐克";//调用属性赋值
7 r.SelectMovieName("《龙门飞甲》");//调用方法选电影名称
8 Console.ReadKey();
9 }
10 }
运行结果:
来看一下定义类的方法的语法:
访问修饰符 返回类型 方法名(参数列表)
{
方法主体;
}
我来简单的解释一下,这个返回类型就是数据类型,表示调用完这个方法之后可以得到一个值。如果不返回值得话,那么这个类型就是void,
比如:private string Qingpingguo(string n) 返回字符串 返回值用关键字“return” 返回
public void Qingpingguo(string n)不返回任何值
方法名就是给方法取个名称,要注意的是在取名字的时候第一个字母要大写。
参数列表就是在调用方法的时候可以通过参数给方法传递数据,方法根据不同的参数产生不同的结果。
不如:private string Qingpingguo(string n)参数是一个,字符串类型
private void Qingpingguo(int i,string n)参数两个,int 和字符串
方法的主体就是这个方法要做的功能。
No.3 在方法的定义中有一种方法叫静态方法,静态方法就是可以不用实例化对象,然后直接调用,语法如下:
访问修饰符 static 返回类型 方法名(参数列表)
{
方法主体
}
静态方法相比普通方法来说比较简单,尤其是在调用的时候,虽然结果都是一样的,但是,我不推荐大家用静态方法,为什么?因为被static关键字修饰的静态的属性和方法都是在程序开始运行的时候就创建了,一直到程序结束才消失,它浪费了很多的资源,所以希望大家在没有必要的情况下还是不要用静态方法。
No.4 方法的重载
方法的重载就是方法的名称相同,方法的参数类型不同或者参数的数量不同
例子:
1 class Regisseur
2 {
3 public void Qingpingguo(string title, string player)//两个参数
4 {
5 Console.WriteLine("电影名字:" + title);
6 Console.WriteLine("主演:" + player);
7 }
8 public void Qingpingguo(string title, string player, string player1)//三个参数
9 {
10 Console.WriteLine("电影名字:" + title);
11 Console.WriteLine("主演:" + player+"和"+player1);
12 }
13 }
在Main方法中调用重载方法
1 static void Main(string[] args)
2 {
3 Regisseur r = new Regisseur();//实例化对象
4 r.Qingpingguo("《龙门飞甲》", "李连杰");//调用两个参数的方法
5 r.Qingpingguo("《龙门飞甲》", "李连杰","周迅");//重载方法,调用三个参数的方法
6 Console.ReadKey();
7 }
8
运行结果:
这个方法的重载比较简单,我也就不做过多说明了,要注意一点的是方法的返回类型不同不叫做重载。
No.5 构造方法
构造方法的作用就是在实例化对象时可以给属性赋值,这样可以简单化我们的代码,它的特殊之处就是方法名称和类名相同,并且没有返回类型,而且构造方法一般用public访问修饰符。如果类里面没有定义好的构造方法,在编译器里会自动创建一个无参数的构造方法,这个构造方法就好似隐式构造方法,我们自己写的那个方法叫显式构造方法,在隐式构造方法中编译器会自动给字段赋值。对于构造方法相对比较简单一些,我们就不深究了。
No.6 参数传递
参数的传递分为,值传递和引用传递,对于值传递我想大家一看字面意思就会明白的。所以还是直接逃到引用传递吧!
在引用传递我们要注意一个关键字“ref”在定义方法时,引用传递的参数前必须加关键字ref,比如:static string qingpingguo(ref string name){} 还有就是在传递参数前必须赋值。我们来看一下:
1 class Program
2 {
3 static void Main(string[] args)
4 {
5 string n = "";
6 string m=qingpingguo(ref n);//调用方法值传递
7 Console.WriteLine(m);//输出返回值
8 Console.WriteLine("博客园里有"+n);//输出参数的值
9 Console.ReadKey();
10 }
11 static string qingpingguo(ref string name)
12 {
13 name="青苹果";
14 Console.WriteLine("我喜欢青苹果");
15 return "返回";
16 }
17 }
运行结果:
在这里要注意的是值传递传递的是参数的复制品,不是它本身;引用传递传递的是参数本身。在刚才我们所说的关键字ref,还有一个是和它对应的就是out,当控制传递回调用方法时,在方法中对参数所做的任何更改都将反映在该变量中。 当希望方法返回多个值时,声明 out 方法非常有用。使用 out 参数的方法仍然可以返回一个值。一个方法可以有一个以上的 out 参数。 若要使用 out 参数,必须将参数作为 out 参数显式传递到方法。简单的说他们两个的区别是ref要求参数在传递给函数前要初始化,而out就不需要,out是在方法中对其完成初始化,它是常见于平台调用中。out适用在需要return多个返回值得地方,而ref则用在需要被调用的方法修改调用者的引用的时候。
总结:1.面向对象的类和方法;
2.方法的定义;
3.静态方法;
4.方法的重载;
5.构造方法;
6.参数传递;
The end!