【C#基础】面向对象

一、为什么需要面向对象:

  在面向对象出现之前,结构化程序设计是程序设计的主流,被称为”面向过程“的程序设计。

    面向过程的开发方法,通常会存在以下问题:

      1、软件复用性差

      2、软件可维护性差

      3、软件灵活性差

  面向对象编程思想中的对象,是一种具有状态(属性)和行为(方法)的数据结构,用于描述现实世界的某个事物,将现实世界的事物模型化。

二、对象与类的关系:

  类:对事物的一种抽象定义;

  对象:客观存在的具体事物。

  2.1、创建类和对象:

    声明类:class className    //<类名>

        {

          //Fields<字段> 存储数据

                                    //Properties<属性> 保护字段,对字段的取值和设值进行限定,属性的本质就是两个方法

          //Methods<方法> 描述对象的行为

                                    //构造函数          初始化对象(给对象的属性依次赋值)

            //类中的成员,如果不加访问修饰符,默认为Private

        }

    创建对象:className Object=new Constructor(参数列表);

            类名   对象名             构造方法()

              类是不占内存的,而对象是占内存的。在对象被创建时,会自动调用构造函数初始化对象;

  2.2、字段与属性:

    1、字段:类的成员,用于描述一类事物的某个特征的变量。

      【举例】:Employee类中具有很多的特征(如姓名、年龄等),在定义类时即可用两个字段分别存储员工的姓名和年龄。

        class Employee  //声明类

        {

          public String employeeName;//员工的姓名字段

          public int emlioyeeAge;//员工的年龄字段

        }

        Employee employee=new Employee();//创建对象(实例化对象相当于实实在在存在的一个人,类只是抽象的定义一个人的类)

        employee.employeeAge=20;//通过对象使用字段,给对象赋值年龄。

    2、属性:对字段的封装,用于阻止非法数据的输入,从而保护内部数据的安全。

      【封装】:隐藏内部实现、对外提供公共操作的方式。

           对象就是封装了数据和操作这些数据的代码的逻辑实体。

           在一个对象内部,某些代码和数据不能被外界访问,对象通过这种方式对内部数据提供不同级别的保护,用于防止程序中的隐藏部分由于意外而被改变或被错误操作。

      【访问修饰符】:从上到下,私有程度逐渐降低

        private:只能在本类中使用
        protected:本类中及其子类中可以使用
        internal:同一命名空间(程序集)中的类可以使用
        public:所有类均可使用

      【举例】:Employee类中具有很多的特征(如姓名、年龄等),在定义类时即可用两个字段分别存储员工的姓名和年龄。

       

      public enum Gender
    {
        man,
        woman
    }
    class Employee//声明员工类
    {
        private String employeeName;//员工的姓名字段
        public String EmployeeName

        {
            get { return employeeName; }
            set { employeeName = value; }
        }

        private Gender gender;
        public Gender Gender
        {
            get
            {
                //在Get方法里对非法值进行限定
                if (gender != Gender.man && gender != Gender.woman)
                {
                    gender = Gender.man;
                }
                return gender;
            }
            set { gender = value; }
        }

        private int employeeAge;//员工的年龄字段
        public int EmployeeAge
        {
            get { return employeeAge; }
            set
            {
                //在Set方法里对非法值进行限定
                if (value <= 0 || value > 100)
                {
                    employeeAge = 18;
                    Console.WriteLine("年龄设置错误!");
                }
                else
                {
                    employeeAge = value;
                }
            }
        }

        /// <summary>
        /// 
        /// </summary>
        public Employee(string name, Gender gender, int age)
        {
            this.EmployeeName = employeeName;
            //在构造函数里对非法值进行限定
            if (gender != Gender.man && gender != Gender.woman)
            {
                gender = Gender.man;
            }
            this.Gender = gender;
            this.EmployeeAge = employeeAge;

        }
    }

        Employee employee=new Employee();//创建对象(实例化对象相当于实实在在存在的一个人,类只是抽象的定义一个人的类)

        employee.employeeAge=20;//设值,自动调用属性EmployeeAge中的set访问器        

        Console.WriteLine("该员工的年龄是:{0}",employee.EmployeeAge);//取值,自动调用属性EmployeeAge中的get访问器

  2.3、方法:(实例方法)面向对象程序设计中,对象可以执行的操作被称为方法。

    1、方法的定义和调用:

      【语法】:访问修饰符  返回值类型  方法名(参数列表)  

           {                    

            方法体;                

           }                         

                    【注意】参数列表可以为空,但括号不能省略;存在多个参数时,需要使用逗号分隔。

                      返回值类型可以是c#中的任意类型;也可以没有返回值,若没有返回值则必须使用Void.

                      方法体中无论有多少行代码都必须使用括号将其括起来。

      【调用】:

        a、同一类中的方法直接通过方法名进行调用;

        b、同一命名空间不同类中的方法调用方式如下:

            ⑴、创建对象;//类名   对象名=new  构造方法();

            ⑵、通过对象名.方法名进行调用。//对象名.方法名();

        c、不同命名空间中的方法调用方式如下:

            ⑴、导入命名空间;//using 命名空间

            ⑵、创建对象;

            ⑶、通过对象名.方法名进行调用。

    2、构造方法:类被实例化时首先执行的一种特殊方法,用于完成对象属性的初始化操作。(在创建对象的同时将属性初始化)

        【注意】:一个类中若没有定义任何构造方法,则运行环境会提供一个无参的构造方法。

        【分为】:无参的构造方法和有参的构造方法。

                               //构造函数,函数名与类名相同

                               //构造函数没有返回值,连Void都不用

        【语法】:访问类名(参数列表)  

             {          

               语句块;

             }

        【举例】:class Employee

             {

                 public Employee(String employeeName,int employeeAge)//创建一个有参的构造函数

               {

                  EmployeeName=employeeName;

                  EmployeeAge=employeeAge;

               }

             }

             //创建对象

             Employee employee=new Employee("Jack",20);

    3、静态方法:(类方法)通过satic关键字修饰的方法

      【语法】:访问修饰符  static  返回值类型  方法名(参数列表)  

           {                        

              方法体;

           }

                 静态和非静态的区别
                   1)、在非静态类中,既可以有实例成员,也可以有静态成员。  
                   2)、在调用实例成员的时候,需要使用对象名.实例成员;
                    在调用静态成员的时候,需要使用类名.静态成员名;
        总结:静态成员必须使用类名去调用,而实例成员使用对象名调用。
                  静态函数中,只能访问静态成员,不允许访问实例成员。
                  实例函数中,既可以使用静态成员,也可以使用实例成员。
                  静态类中只允许有静态成员,不允许出现实例成员。
 

猜你喜欢

转载自blog.csdn.net/yf391005/article/details/83989367