(二)C#基础加强系列之 “字段、属性、构造方法“篇
实在是对不住大家,因为课程紧写博客的事儿就给耽误了,教学视屏在还在上传的过程中,等上传好了,博主会第一时间发表一篇博客通知大家去下载的,请大家耐心等待!!!还有一件事情要对大家说的是,如果没有什么特殊的事情,博主都会在周末的时候更新博客的,大家记得关注。
那么,下面切入正题,大家也知道C#是一门面向对象的编程语言,接下来为大家写的就是C#中的面向对象中的字段、属性和构造方法。
首先,我们写一个简单的Person类,教大家如何写类和使用类。我们添加一个类文件,在类文件中写下如下代码:
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace _01面向对象 { class Person //创建一个类文件 { private string name;//为Person类定义一个name字段(姓名) public string Name//name字段的属性 { get { return name; } set { name = value; } } public int age;//为Person类定义一个age字段(年龄) public int Age//age字段的属性 { get { return age; } set { age = value; } } public string sex;//为Person类定义一个sex字段(性别) public string Sex//sex字段的属性 { get { return sex; } set { sex = value; } } public void SayHello()//方法 { Console.WriteLine("你好,我的名字叫{0},我今年{1}岁了,我是{2}", name, age, sex); } } }
大家有可能问属性有什么作用呢?其实啊,属性是对字段的一种封装,好处就是可以避免外界直接修改类的内部的的内容,符合面向对象的封装原则。比如当对字段进行赋值的时,可以执行一些检查,当某个字段为空时,做一些相应的处理。Ctrl+r+e 快捷键(封装字段)
在这段代码中,我将 name 这个字段定义的修饰符是 private ,这表示外界是无法直接使用 name 这个字段的,如果外界想使用,就必须通过属性来访问,在这里,我们控制了外界的访问,也体现了面向对象中封装的好处。而其他的字段定义成 public ,那么外界就既可以直接访问的到,也可以通过属性进行访问。
再来看下面使用 Person 类的代码:
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace _01面向对象 { class Program { static void Main(string[] args) { Person p = new Person();//想要使用类,就必须就 Person 这个对象 new 出来。 p.Name = "Mr Lucky";//为字段赋值 p.Age = 1000; p.Sex = "男生"; p.SayHello();//调用类中的方法 Console.ReadKey(); } } }
得到的结果为:
当我们在用 p 点出来的各个字段和属性中,我们会发现,我们定义的 name 字段是不会被点出来的,点出来的只有 name 的属性 Name,而 age 和 sex 字段是可以直接点出来的,这就是修饰符的原因了,此时,想为 name 字段赋值,就必须通过属性进行相应的操作。其他的字段则可以直接使用。
那么,大家结合两端代码一起看,为大家讲解一下 get 与 set :
get:(读)
当外界想使用 name 这个字段的值得时候,就会调用 get ,将 name 的值返回。
set:(写)
当我们为把 Mr Lucky 赋值给 name 的属性 Name 时,会对应的调用 set,此时 value 中的值就是 Mr Lucky,程序将 value 中的值在赋给name字段,那么 name 这个字段中就存着 Mr Lucky 。
上面为大家讲解了面向对象中的 “字段" 和 “属性”,下面就为大家讲解面向对象中的 “构造方法的概念”:
什么是构造方法呢?
构造方法也是一种方法,但是它具有类中其他方法所不具备的一些特性,它是一个特殊的方法。用来创建对象,并且可以在构造方法中对对象进行初始化。没有返回值,void都不需要。
方法名:当我们自己写方法时,方法名可以自己随便命名,但是构造方法不可以。构造方法的名字必须与类名相同。也就是说,当类中的一个方法名与类名相同时,C#就认为此方法为类的构造方法。
执行过程:类中的普通方法是在类实例化之后被调用执行的,而构造方法则是在类实例化之前执行的。也就是说,当我们创建一个实例时,会首先执行构造方法,然后进行类的实例化。
构造函数可以有参数,在 new 对象时传递参数即可,并且构造函数可以进行重载。
看下面的两端关于构造方法的代码及得到的结果:
类:
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace _02构造方法 { class Person { public string Name {get;set;} //属性 姓名 public int Age { get; set; } //属性 年龄 public Person()//构造方法 没有参数 { Name = "未知"; Age = 0; } public Person(string name)//构造方法的重载 有一个参数 { Name = name; } public Person(string name, int age)//构造方法的重载 有两个参数 { Name = name; Age = age; } } }
主方法:
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace _02构造方法 { class Program { static void Main(string[] args) { Person p1 = new Person(); Person p2 = new Person("Mr lucky"); Person p3 = new Person("Mr Lucky", 1000); Console.WriteLine("姓名:{0} 年龄:{1}",p1.Name,p1.Age); Console.WriteLine("姓名:{0} 年龄:{1}", p2.Name, p2.Age); Console.WriteLine("姓名:{0} 年龄:{1}", p3.Name, p3.Age); Console.ReadKey(); } } }
得到的结果:
我们发现,当我们的构造方法有参数的时候。在 new 实例时,也是必须要传相应的参数的,不然就会报错。
在这里要告诉大家的是:
构造方法可有可无,视自己的情况判断是否需要写构造方法,当我们类中没有写构造方法时,它自己会有默认的构造方法的,在第一段代码中,我们没有写构造方法,但是我们来看下面的一张图:
这张图是反编译第一段的 Person 类,仔细看,和我们自己写的代码多了什么?多了一个 pubilc Person(); 这就是内部自己为我们添加的一个构造方法。
最后,给大家写一个用面向对象实现的 简单计算器 代码如下:
类:
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace 面向对象计算器 { class Calc { private int num1;//第一个需要运算数 public int Num1//属性 { get { return num1; } set { num1 = value; } } private int num2;//第二个需要运算数 public int Num2//属性 { get { return num2; } set { num2 = value; } } private string oper;//运算符 public string Oper { get { return oper; } set { oper = value; } } public int Jisuan()//对传过来的数进行运算的方法 { int res; switch (oper) { case "+": res = num1 + num2; break; case "-": res = num1 - num2; break; case "*": res = num1 * num2; break; case "/": res = num1 / num2; break; default: res = 0; Console.WriteLine("输入有误"); break;//如果运算符有错,直接返回结果 0; } return res; } } }
主方法:
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace 面向对象计算器 { class Program { static void Main(string[] args) { while (true) { Console.WriteLine("请输入第一个数字:"); int num1 = Convert.ToInt32(Console.ReadLine()); Console.WriteLine("请输入第二个数字:"); int num2 = Convert.ToInt32(Console.ReadLine()); Console.WriteLine("请输入运算符:"); string oper = Console.ReadLine(); Calc cal = new Calc();// new 一个实例 cal.Num1 = num1;//将用户输入第一个数传给类 cal.Num2 = num2;//将用户输入第二个数传给类 cal.Oper = oper;//将用户输入的运算符传给类 int res = cal.Jisuan();//调用类中的 Jisuan 方法 将返回的结果值给res Console.WriteLine("{0}{1}{2}={3}",num1,oper,num2,res);//将计算得到的结果值打印到屏幕上 Console.ReadKey(); } } } }
好了,对于基础加强系列之”面向对象之 字段、属性、构造方法“篇就写到这了,教学视屏很快就会公布的,大家耐心等待吧!!!