一,复习
练习题
struct Student
{
public int age;
public string name;
public string phoneNumber;
}
Student[] student1 = new Student[10];
student1[0].name = Console.ReadLine();
student1[0].age = Convert.ToInt32(Console.ReadLine());
student1[0].hobby = Console.ReadLine();
Console.WriteLine(student1[0].name);
Console.WriteLine(student1[0].age);
Console.WriteLine(student1[0].hobby);
二,类
1.类的定义
class Student//class关键字 类名
{//数据成员
public string name;
public int age;
//函数成员:定义方法
public void show()
{
Console.WriteLine("我叫{0}今年{1}",name,age);
}
}
2.创建对象
Student student1;//声明
student1 = new Student();//创建了一个student的对象
student1.name = "小明";
student1.age = 13;
student1.Show();
3.练习
4.构造函数
创建对象时会做初始化,这时候会调用构造函数
public Vehicle(int Speed1,int MaxSpeed1,int Weight,int id)//构造函数和类名一致
{
this.Speed = Speed1;//this指当前创建的对象,可以不用
this.MaxSpeed = MaxSpeed1;
this.Weight = Weight;
this.id = id;
}
1.属性和字段
//定义字段
public string name;
public int age;
//定义属性
public int num
{
get//当我去访问num的值的时候,num的值由get的返回值决定
{
Console.WriteLine("访问的时候会执行");
return id1*id2;
}
set//当我去修改num的值得时候会执行set块中的代码,set会拿到最新的值
{
id1 = value;
Console.WriteLine("修改的时候会执行,得到新的值value为{0}", value);
}
}
2.属性 简写方式
public int num2 { get; set; }//作业和字段类似
public void run()
{
Console.WriteLine("以{0}速度行驶,最大速度为{1}",Speed,MaxSpeed);
}
}
5.匿名类型
var a ="dfd";
var b = 1;
Console.WriteLine(a);
Console.WriteLine(b);
6.类的继承
1.实现继承的写法
//创建一个基类(父类)
class Hero
{
public Hero(string name1,int life1)
{
name = name1;
life = life1;
}
public string name;
public int life;
public virtual void move()
{
Console.WriteLine("我是{0},生命{1},开始移动",name,life);
}
}
//创建一个派生类(子类)
class ADC:Hero //c#中只支持单继承 实现多继承,要使用接口
{
public ADC(string name1,int life1,int attack1):base(name1, life1)
{
//:base(name1, life1)把子类中的name和life值传给父类中的构造函数
attack = attack1;
}
public int attack;
public void shoot()
{
Console.WriteLine("射击");
}
public override void move()//重写父类中的方法
{
base.move();//调用一下父类中的方法 保留父类中move方法
Console.WriteLine("我飞");
}
}
2.base关键字
-
当我们使用继承的时候,可能子类中也会有相同的属性和方法,但是有的时候我们就想使用父类中的属性和方法,这时候我们可以使用base关键字,base表示的就是父类,我们可以通过base.父类中的属性名来获取父类中的属性
-
base的第二个使用方式,将子类中的传进来的参数传递给父类的构造方法
public ADC(string name1,int life1,int attack1):base(name1, life1) { //:base(name1, life1)把子类中的name和life值传给父类中的构造函数 attack = attack1; }
7.虚函数(重写父类中的方法)
virtual关键字,表示可以重写的函数
public virtual void move()
{
Console.WriteLine("我是{0},生命{1},开始移动",name,life);
}
override关键字,表示是重写后的函数
public override void move()//重写父类中的方法
{
base.move();//调用一下父类中的方法 保留父类中move方法
Console.WriteLine("我飞");
}
8.抽象类
抽象类是一个不完整的模板,因为里面有抽象函数,抽象函数可以理解为一个没有函数体的函数,那么我们在使用继承的时候,会提示你编写攻击的函数,否则就会报错,这样可以更加规范我们代码的编写。
public abstract class MyMath//抽象类型是不完整的,不能实例化
{
public int num;
public int Max()
{
return 1;
}
public abstract int Min();//表示这个方法还没有实现
}
9.常见访问修饰符的了解
- public 访问的最高权限,允许在同个项目或不同的项目中被访问
- private 只允许在类或结构中被访问
- internal 只允许在同个项目中被访问
- protected 只允许在同一个类或结构或者此类的派生类中被访问
10.密封类
当我们创建的类不想被继承的时候,我们可以在类前面加sealed修饰符表示该类无法被继承
11.其他修饰符
1.static 静态和非静态的区别:
- 被static修饰的是静态成员,没有被static修饰的是非静态成员(实例成员)
- 在静态类中可以有静态成员,也可以有非静态成员,但是静态类中只能有静态成员
- 在类中,静态方法要调用的话只能通过类名.方法名,不能通过对象名.方法名调用
- 在静态函数中只能访问静态成员的数据,不能访问非静态成员(实例成员)的数据
- 实例函数中既可以使用静态成员也可以使用实例成员
2.readonly
只能在声明和构造函数中初始化赋值,在其他地方不能修改其值,只能被读取,不能被修改
练习题
public class MyMath
{
public static double r;
public const double PI=3.14;
public MyMath(double r)
{
MyMath.r = r;
}
public static double perimater()
{
return 2 * PI * r;
}
public static double area()
{
return PI * r * r;
}
public double volume()
{
return 4.0/3 * PI * r * r * r ;
}
}
double r = Convert.ToDouble(Console.ReadLine());
MyMath mymath = new MyMath(r);
Console.WriteLine("此圆周长为{0},面积为{1},对应球体积为{2}", MyMath.perimater(), MyMath.area(), mymath.volume());