练习题1
编写一个程序,定义结构(有姓名,年龄,手机号码三个字段),再定义一个一维数组,把结构作为数组元素类型,存入数据,然后依次输出。
Student student2;
Student student3;
student2.name = "小黑";
student2.age = 12;
student2.phone = 232472384;
student3.name = "小白";
student3.age = 112;
student3.phone = 26666484;
Student[] student = new Student[3] { student1, student2, student3 }; //用数组储存结构体,并遍历输出信息
foreach(Student i in student){
Console.WriteLine(i.name);
Console.WriteLine(i.age);
Console.WriteLine(i.phone);
一、面向对象
1.为什么要使用面向对象编程
我们可以将程序模块块,进行模块划分,每个模块提供特定的功能,这样每个模块都是独立的,互不影响,比如我们创建一个动物类,规定了所有动物都有走路的动能,或者性别的属性等等,如果我们想创建一个动物,比如猫,这个时候我们可以使用该类中有的方法和字段,那如果想创建一个狗对象同样可以用该类生成,同样也会有类中的方法,但这时候狗中的方法和属性都是独立和猫中的方法和字段互不影响,我们从这里可以明显看到面向对象可以提高代码的复用性,我不需要重复的定义函数和变量。
2.类是什么?
类实际上是创建对象的模板,每个对象都包含数据,并提供了处理和访问数据的方法。
3.类的基本定义
4.根据类创建对象
5.练习
public class Vehicle
{//定义一个车辆类
public Vehicle(int Speed, int MaxSpeed, int Weight) //ctrl+alt 连续多选 ctrl+c ctrl + v
{//构造方法
this.Speed = Speed;
this.MaxSpeed = MaxSpeed;
this.Weight = Weight;
}//this.Speed 与Speed的区别 不是同一个
public int Speed;
public int MaxSpeed;
public int Weight;
public void Run()
{
Console.WriteLine("当前时速{0}, 最大速度为{1}", Speed, MaxSpeed);
}
public void Stop()
{
Console.WriteLine("当前速度为{0},最大速度为{1}", Speed, MaxSpeed);
}
static void Main(string[] args)
{Vehicle cap;
Vehicle bus;
cap = new Vehicle(90, 150, 5000);
bus = new Vehicle(60, 100, 100000);
cap.Run();
bus.Stop();
}
}
}
6.构造函数
1. 构造函数的作用
构造函数会在类构造对象的时候自动调用自己,我们一般用于初始化对象存储的数据,所以构造函数本质是用于初始化数据的函数
2. 构造函数的基本写法
构造函数是类中和类同名的一个方法,当创建对象的时候自动调用该方法,一般用于初始化数据
构造函数中也可以调用对象中的方法,获取对象中的返回值存到对象的字段中
3.属性和字段
1.字段
2.属性的定义
3. 属性的特点
-
访问属性和访问字段一样,当取得属性的值得时候,就会调用属性中的get块执行get块中的语句,所以get块需要一个返回值,类型就是属性的类型;当我们去给属性设置值得时候,就会调用属性中的set块,我们可以在set块中通过value访问到我们设置的值
设置只读或者只写,如果我们给属性只设置get块那么就是只读,如如果只设置set块那么就是只写 4. 两个访问修饰符
-
public公开的的,访问最高权限
-
private私有的,只能在类或者结构体内部中使用
9.使用其他项目中的类
- 在本项目中引用其他项目中的命名空间,比如这里我们在demo01项目中引入_demo中的命名空间
- 第一步
- 第二步
- 第三步
- 注意:想要使用其他项目中的命名空间中的类,那么该类的访问修饰符要设置为public公开的形式
-
8.匿名类型
当我们不确定数据的类型的时候,我们可以使用关键字var声明变量,那么该变量的类型就由初始化赋的值决定,如果赋的是字符串那么就是字符串类型
9.类的继承
1.为什么需要继承
很多类在项目中可能有相似的数据,比如在一个游戏中Boss类和小怪类Enemy这些类有很多相同的属性,比如血量,攻击值等,所以这个时候我们可以使用继承来让这两个类继承自同个类
2.实现继承的写法
3.base关键字
- 当我们使用继承的时候,可能子类中也会有相同的属性和方法,但是有的时候我们就想使用父类中的属性和方法,这时候我们可以使用base关键字,base表示的就是父类,我们可以通过base.父类中的属性名来获取父类中的属性
- base的第二个使用方式,将子类中的传进来的参数传递给父类的构造方法
10.虚函数(重写父类中的方法)
-
11.抽象类
1.为什么要有抽象类
比如我们讲的怪物可能都有一技能的,也就是说都会有一个一技能攻击的方法,但是每个怪物的一技能都不一样,有时候在编写项目的时候可能忘记编写子类中一技能的方法,我们可以定义一个抽象父类,抽象类是一个不完整的模板,因为里面有抽象函数,抽象函数可以理解为一个没有函数体的函数,那么我们在使用继承的时候,会提示你编写攻击的函数,否则就会报错,这样可以更加规范我们代码的编写
定义一个派生类继承抽象类中的方法,这时候会提示你要重写min方法
接点击提示,实现抽象类
12.常见访问修饰符的了解
- public 访问的最高权限,允许在同个项目或不同的项目中被访问
- private 只允许在类或结构中被访问
- internal 只允许在同个项目中被访问
- protected 只允许在同一个类或结构或者此类的派生类中被访问
13.密封类
当我们创建的类不想被继承的时候,我们可以在类前面加sealed修饰符表示该类无法被继承
14.其他修饰符
1.static 静态和非静态的区别:
- 被static修饰的是静态成员,没有被static修饰的是非静态成员(实例成员)
- 在静态类中可以有静态成员,也可以有非静态成员,但是静态类中只能有静态成员
- 在类中,静态方法要调用的话只能通过类名.方法名,不能通过对象名.方法名调用
在静态函数中只能访问静态成员的数据,不能访问非静态成员(实例成员)的数据
实例函数中既可以使用静态成员也可以使用实例成员
2.readonly 只能在声明和构造函数中初始化赋值,在其他地方不能修改其值,只能被读取,不能被修改
练习题
using System;
namespace MyMath
{
class MyMath
{
public const double PI = 3.14;
public static void Perimeter(double r)
{
Console.WriteLine(2 * PI * r);
}
public static void Area(double r)
{
Console.WriteLine(PI * r * r);
}
public void Volume(double r)
{
Console.WriteLine(4 / 3 * PI * r * r * r);
}
}
class Program
{
static void Main(string[] args)
{
Console.WriteLine("请输入半径:");
double R = Convert.ToDouble(Console.ReadLine());
Console.WriteLine("周长为:");
MyMath.Perimeter(R);
Console.WriteLine("面积为:");
MyMath.Area(R);
Console.WriteLine("体积为:");
MyMath circle = new MyMath();
circle.Volume(R);
}
}
}