readonly声明只读字段,只能在声明或静态构造函数中初始化
readonly声明只读字段,只能在声明或静态构造函数中初始化
protected权限:没有继承是与private一样,有继承时可以被子类访问
构造函数的调用
抽象类虚拟类的关系和密封类
虚拟方法和抽象方法都可以供派生类重写和都用override重写。那么它们之间有什么区别呢?
1.抽象方法使用abstract关键字,虚拟方法使用virtual关键字
2.抽象方法是可以看成是没有实现体的虚拟方法
3.虚拟方法与多态性关系密切,虚拟方法为子类提供了重写该方法的选项允许子类完全或部分重写该类的方法,必须写方法体。
4.抽象方法只是一个定义,没有提供实现部分,也就是没有{},也不要在里面写内容,需要在子类中实现,抽象方法是一种强制子类重写的方法,否则子类将不能被实例化。
5.抽象方法必须在派生类中重写,这一点跟接口类似,虚拟方法不必。
6.抽象方法不能声明方法体,而虚拟方法可以。
7.抽象类不能被实例化(不可以new),只能实例化实现了全部抽象方法的派生类;而包含虚方法的类可以实例化。
8.虚拟方法是指能被重载覆盖的方法,而抽象方法是虚拟方法中的特例,指完全没有具体实现的虚拟方法.
9.如果类中包含抽象方法,那么类就必须定义为抽象类,不论是否还包含其它一般方法
10.抽象方法是必须被派生类覆写的方法,调用虚拟方法,运行时将确定调用对象是什么类的实例,并调用适当的覆写的方法
11.一个虚拟方法的实现可以由派生类取代。取代所继承的虚拟方法的实现的过程称为重写该方法;在一个虚拟方法调用中,该调用所涉及的那个实例的运行时类型确定了要被调用的究竟是该方法的哪一个实现。
12.抽象方法是需要子类去实现的.虚方法,是已经实现了,子类可以去覆盖,也可以不覆盖取决于需求.
————————————————
原文链接:https://blog.csdn.net/XVJINHUA954/article/details/106791595
密封类(sealed)
写法:sealed class 类名 方法名写到权限修饰符后即可
对于类,表示不能继承该类
对于方法,表示不能重写该方法
隐藏方法
若是虚方法,调用的时候会调用子类重写后的方法
若是隐藏方法,会调用父类的方法,不会调用子类的方法
class Enemy
{
public void AI()
{
Console.WriteLine("Enemy的AI");
}
}
class Boss : Enemy
{
public new void AI()
{
Console.WriteLine("Boss的AIs");
}
}
class program
{
static void Main(string[] args)
{
Enemy b = new Boss();
b.AI(); // 敌人的AI
}
}
⭐虚函数
子类可以赋值给父类
父类不可赋值给子类
1. 虚函数的特点
虚函数是面向对象语言中多态性的重要实现. 当一个函数方法在声明时, 前面带了virtual关键字, 这个函数就是一个虚函数. 它与非虚函数的主要区别在于它的实现可以在派生类中进行重写(override)(非强制要求). 重写后的函数一样也是虚函数, 当一个类或其基类中存在虚函数后就不允许出现同名, 返回值, 参数类型个数相同的非虚函数.
虚函数由于可以被子类改写的特点, 不允许设为私有(private), 同时也不能和static, override, abstract等一起使用.除了函数方法外, C#中还可以用virtual修饰属性, 索引器, 事件等等.
2. 虚函数的执行过程
当调用一个对象的一个函数时, 系统会首先去检查该对象的声明类中这个函数是不是虚函数, 如果不是虚函数就直接执行函数. 如果是虚函数的话再去检查这个对象的实例类, 看看实例类中有没有重写这个虚函数, 如果有的话就直接执行该函数, 否则就去找这个实例类的父类, 看看他的父类中有没有重写这个虚函数,有的话就执行, 没有的话就继续找直到找遍所有父类, 如果没有override关键字, 最后会执行申明类里的虚函数.
例子:
public class GoodClass
{
public virtual void GoodFunc()
{
Console.WriteLine("This is a good function!!!");
}
}
public class NiceClass : GoodClass
{
public override void GoodFunc()
{
Console.WriteLine("This is a nice function");
}
}
public class start
{
public void main()
{
GoodClass gc = new GoodClass();
gc.GoodFunc();
GoodClass nc = new NiceClass();
nc.GoodFunc();
}
}
This is a good function!!!
This is a nice function
————————————————
public class GoodClass
{
public virtual void GoodFunc()
{
Console.WriteLine("This is a good function!!!");
}
}
public class NiceClass : GoodClass
{
public override void GoodFunc()
{
Console.WriteLine("This is a nice function");
}
}
public class GreatClass : NiceClass{}
public class start
{
public void main()
{
GoodClass gc = new GreatClass();
gc.GoodFunc();
}
}
This is a nice function
————————————————
原文链接:https://blog.csdn.net/lx2054807/article/details/102703775
base.变量 访问父类成员
this.变量 访问当前类成员
访问权限
public 全局可访问(最开放)
private 只有在己类中可访问(最私密)
protected 继承类可访问
重点 值类型和应用类型在内存中的存放
属性用法(缩写prop)
一般将成员变量命名为驼峰法,例如myAge,elemNum。且一般都是私有化。
属性命名一般是首字母大写,大驼峰法,属性变量名会被系统自动创建,和其他变量无关。
使用时里面包含了set和get,若其中一个不写则没有相应功能。
匿名类型
var 类型,自动分配变量类型,像c++的auto
while(true){
try{
break}
}
循环捕获异常,有异常直接catch,无异常跳出
1.函数重载
2.new是开辟地址,如何进行比较,比较的是在内存中的地址
3.如何重载
运算符重载关键字:operator
运算符首先要看重载的是什么符号,然后定义什么类型,都是bool
访问修饰符 static 返回值类型 operator 运算符(两边地址里边的值)
1.怎么调用父类的构造函数?
在方法后边+:base(),括号是父类的构造函数的参数
1.abstract抽象类
2.抽象函数,只有定义的方法,没有方法体
3.类前边加abstract就是抽象类
4.定义抽象类的方法
在抽象类中,定义抽象方法,只需要在返回值类型面前+abstract即可,没有方法体
5.抽象类不能实例化一个对象
6.抽象类可以利用子类构造
7.抽象类利用子类重写方法时,在返回值类型前加override
8.sealed密封类
9.密封类是不能被继承的
10.如何声明密封方法?
需要重写后才能密封,sealed o'v
静态
加上static就是静态
静态成员通过类来访问
静态变量存储在静态存储区
静态方法只能 访问静态数据
补充课程参考集合链接
1、https://www.runoob.com/csharp/csharp-array-class.html
2、https://learn.microsoft.com/zh-cn/dotnet/api/system.array?view=net-7.0
虚方法用父类定义的时候,显示的是子类方法
隐藏方法用父类定义的时候,显示的是父类方法
c#不支持多重继承
字符串常量保存在静态存储区
容量
添加
插入