C#基础- 类和对象-08

大雨天爸爸开车载妈妈和我去公园。路上有个积水坑,仗着我家大吉普就开过去了。结果溅一个男生一身水。我爸想给人家道个歉,就把车倒了回来。路过积水坑又溅人家满身水。这回谁也不敢道歉了,我们赶紧开溜。再次溅那男生一身水。然后我就听见那条街上久久回荡着“我艹你大爷!”


========================手动分割线==========================
上节练习答案:
定义日期结构体:

struct Date
{
    public int year;
    public int month;
    public int day;

    // 添加构造方法
    public Date (int _year, int _month, int _day)
    {
        year = _year;
        month = _month;
        day = _day;
    }
}

定义时间结构体:

struct Hero
{
    public string name;
    public int blood;
    public Date date;

    // 添加构造方法
    public Hero (string _name, int _blood, Date _date)
    {
        name = _name;
        blood = _blood;
        date = _date;
    }
}

在Main函数中:

        Hero[] hertArr = new Hero[5];
        string[] nameArr = { "A", "B", "C", "D", "E" };

        Random bloodR = new Random ();
        Random yearR = new Random ();
        Random monthR = new Random ();
        Random dayR = new Random ();

        for (int i = 0; i < 5; i++) {
            Date tempDate = new Date (yearR.Next (2010, 2016), monthR.Next (1, 12), dayR.Next (0, 31));
            hertArr [i] = new Hero (nameArr [i], bloodR.Next (1, 10), tempDate);
        }

        Console.WriteLine ("所有英雄的信息:");
        for (int i = 0; i < 5; i++) {
            Console.WriteLine ("姓名:{0},血量:{1},出生日期:({2},{3},{4})", hertArr [i].name, hertArr [i].blood, hertArr [i].date.year, hertArr [i].date.month, hertArr [i].date.day);
        }

将所有英雄按血量从高到低排序:

        // 这点应该没问题,自行补充

将所有英雄按创建的月份,从小到大排序:

        // 这点应该没问题,自行补充

一、 类

定义:具有相同特征和行为的事物的抽象,就相当于一个自定义的数据类型,可以用来定义变量,其实类就是抽象的概念 。
在生活中我们经常会遇到各种各样的分类,那么类与类之间的划分必定是按照一定得标准来进行划分的。比如,说球类,那么这是一个抽象的概念,因为球类中包括很多种,篮球、足球、乒乓球、棒球、网球等等。球类具体指的是啥得看情况而定。

1.1 类的创建(类名大写)

class关键字 类名
{
    类的特征 (字段)
    类的行为(方法)
}

1.1.1字段

  • 格式:访问修饰符 数据类型 字段名
  • 注意:1、类中的字段如果不带访问修饰符,默认是私有的,如果想外界访问,必须带public修饰符
  • 类中的字段在定义时可以赋初值

1.1.2方法

  • 概念:具有特定功能的代码块,描述类的行为

  • 作用:用来实现特定的功能,将一些复杂的逻辑进行拆分,模块化管理
    代码,提高代码的复用性。

  • 格式:

   访问修饰符 返回值类型 方法名(参数列表)
    {
        语句;
    }

访问修饰符:public 、private、protected、internal、protected internal

  • public 公有访问。不受任何限制。

  • private 私有访问。只限于本类成员访问,子类,实例都不能访问。

  • protected 保护访问。只限于本类和子类访问,实例不能访问。

  • internal 内部访问。只限于本项目内访问,其他不能访问。

  • protected internal 内部保护访问。只限于本项目或是子类访问,其他不能访问。

  • 返回值:方法执行返回的结果,只能通过return返回,我们可以通过定义和返回值同样类型的数据来接收方法的返回值,return返回值的类型必须要和定义方法时返回值的类型一致。

  • 方法名:方法的标识。

  • 命名规则:尽量见名知意,驼峰命名,首字母大写,

  • 参数列表:说明在方法调用时,需要主调方法传入的数据的类型

  • 语句:方法具体实现的功能,这部分的代码必须写在方法大括号中,如果直接写在类中,会编译错误。

方法的分类:
1、根据方法创建的对象,可以分为系统方法和自定义方法。
2、根据参数和返回值,可以分为无参无返,无参有返,有参有返,有参无返

  • 比如创建一个人类:
     class Person
     {

添加字段:

        //姓名
        public string name;
        //性别
        public string gender = "男";
        //年龄
        public int age;

添加方法:


        // 睡觉(无参无返)
        public void Sleep ()
        {
            Console.WriteLine ("休息好才能活好");
        }
        //吃饭(有参无返)
        public void Eat (string food)
        {
            Console.WriteLine ("{0}最喜欢吃{1}", name, food);
        }
        //敲代码 (无参有返)
        public bool Code ()
        {
            return false;
        }
        //计算 (有参数有返回)
        public int Sum (int a, int b)
        {
            int sum = a + b;
            return sum;
        }
    }

练习:创建三个类,分别是汽车、手机、学生,分别写出这各个类中三个特征
汽车类:

    class Car
    {
        public string color;
        public string brand;
        public int price;

        //跑(无参数无返回值)
        public void Run ()
        {
            Console.WriteLine ("开车了开车了!");
        }

        //载人(有参数无返回值)
        public void MannedPeople (int count)
        {
            Console.WriteLine ("本次开往小太阳幼儿园的车可以载{0}个人", count);
        }
    }

手机类:

    class Phone
    {
        public string brand;
        public string os;
        public string rom;

        //听歌方法(有返回值无参数)返回有多少首歌
        public int ListenSing ()
        {
            return 200;
        }

        //打电话(无返回值有参数)给谁打电话
        public void Call (string name)
        {
            Console.WriteLine ("老王在给{0}打电话", name);
        }

        //看视频(无参数无返回值)
        public void SeeMovie ()
        {
            Console.WriteLine ("手机看视频很方便");
        }
    }

学生类:

    class Student
    {
        public string name;
        public string gender;
        public int num;

        //学习
        public void Study ()
        {
            Console.WriteLine ("不让我学习,还不如让我去死");
        }

        //运动
        public void Sport (string sport)
        {
            Console.WriteLine ("{0}最喜欢{1}", name, sport);
        }

        //玩游戏
        public void Games (string game)
        {
            Console.WriteLine ("{0}最喜欢的游戏是{1}", name, game);
        }
    }

二、对象

定义:类的实例,类的具体表现,生活中万事万物都是对象。

2.1 对象的创建

  • 对象的创建格式: 类名 对象名 = new 类名();
 class MainClass
    {
        public static void Main (string[] args)
        {
            Person person = new Person ();
            person.name = "李明";
  • 字段的访问(取值、赋值)格式:对象名.字段名
            person.age = 22;
            person.gender = "男";
            Console.WriteLine (person.name + "今年" + person.age
            + "岁" + "性别" + person.gender);

2.2类中方法的调用

  • 方法调用格式:对象名.方法名(实际参数列表)

注意:
1、当我们调用没有的参数方法时,小括号不能省略
2、当调用有参数的方法时,所给的实际参数必须和定义方法时的形式参数类型一致,个数一致,顺序一致
3、在调用有返回值的方法时,需要定义一个和返回值类型相同的变量进行接收返回值,以便接下来使用

        person.Sleep (); //调用睡觉的方法
        person.Eat ("香蕉");
        int result = 0;//用来接收person调用Sum方法后的返回值
        result = person.Sum (2, 3);
        Console.WriteLine (person.name + "计算的结果为" + result);

练习:分别创建汽车、手机、学生对象,并给相应的对象中的字段赋值并打印,并使用对象调用类中的方法

  • 汽车:

          Car car = new Car ();
    
          car.brand = "宝马";
    
          car.color = "黄色的";
    
          car.price = 2000000;
    
          car.Run ();
    
          car.MannedPeople (2);
    
          Console.WriteLine ("我的" + car.color +
    
          car.brand + "价值" + car.price);
    
  • 手机:

          Phone phone = new Phone ();
    
          phone.brand = "iPhone6sp";
    
          phone.os = "iOS";
    
          phone.rom = "64G";
    
          Console.WriteLine ("我的" + phone.brand +
    
          "系统是" + phone.os + "内存是" + phone.rom);
    
          phone.Call ("杰克");
    
          int singCount = 0;
    
          singCount = phone.ListenSing ();
    
          Console.WriteLine ("我的" + phone.brand + "有" + singCount);
    
  • 学生自行补充

三、形式参数和实际参数

  • 形式参数:在方法定义的时候,指定的参数叫做形式参数, 在方法调用之前,形式参数的值不确定

     //计算 (有参数有返回)
     public int Sum (int a, int b)
     {
         int sum = a + b;
         return sum;
     }
    
  • 实际参数:在方法调用的时候,指定的参数叫做实际参数,它的值是唯一确定的

          result = person.Sum (2, 3);
    
  • 实际参数向形式参数传递的过程,是一个拷贝的过程,实际参数的个数,类型,顺序和形式参数要一致

四、方法的嵌套调用

1、创建一个Computer类

    class Computer
    {
        private string name;
        private float number;
        //添加赋值的方法  --带有参数,不带返回值
        public void SetName (string _name)
        {
            name = _name;
        }
        //添加取值方法 --无需参数,需要返回值
        public string GetName ()
        {
            return name;
        }
        //创建一个方法来实现比较两个数的大小,返回最大值
        public int MaxOfTwo (int a, int b)
        {
            return a > b ? a : b;
        }
        //创建一个求三个数最大值的方法
        public int MaxOfThree (int a, int b, int c)
        {
            return this.MaxOfTwo (this.MaxOfTwo (a, b), c);
        }
    }

2、创建它的对象,computer

        Computer computer = new Computer ();

3、调用这个类中的比较大小的方法,来找出两个int类型中最大值

        int num1 = 10;
        int num2 = 20;
        int max = computer.MaxOfTwo (num1, num2);
        Console.WriteLine ("最大值是:" + max);

4、使用类中的方法找出下面三个数中最大值

        int num3 = 30;
        int num4 = 1;
        int num5 = 10;
        int max1 = computer.MaxOfThree (num4, num3, num5);
        Console.WriteLine ("三个数中最大值:" + max1);

五、setter和getter方法

由于面向对象的封装、继承和多态性原因,类的字段的可见度如果设置为公开的,会违反封装特性。如果字段设置成私有的,会违反继承特性。所以,通常我们还会把字段设置成protected,受保护的字段,如果需要外界能够访问到,我们就需要提供访问的接口(方法)。受保护的字段,主调方法中是没法访问到的

        computer.SetName ("电脑");

        Console.WriteLine (computer.GetName ());

本次讲解就到这里,有关技术问题请小伙伴们添加QQ群:941928511,大家一起探讨!
版权声明:本文为博主原创文章,转载请附上原文出处链接和本声明

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容