VR_C#拒绝摸鱼第八天

88 阅读4分钟

一,复习

练习题

image.png

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.练习

image.png

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

只能在声明和构造函数中初始化赋值,在其他地方不能修改其值,只能被读取,不能被修改

练习题

image.png

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());