大雨天爸爸开车载妈妈和我去公园。路上有个积水坑,仗着我家大吉普就开过去了。结果溅一个男生一身水。我爸想给人家道个歉,就把车倒了回来。路过积水坑又溅人家满身水。这回谁也不敢道歉了,我们赶紧开溜。再次溅那男生一身水。然后我就听见那条街上久久回荡着“我艹你大爷!”
========================手动分割线==========================
上节练习答案:
定义日期结构体:
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,大家一起探讨!
版权声明:本文为博主原创文章,转载请附上原文出处链接和本声明