1 访问级别约束
子类访问级别不能比父类高 儿子能去的地方老子一定能去
方法、属性等暴露的返回值、参数的数据类型不能比方法、属性或者所在类的可访问级别低,因为这些方法、属性要能在高级场合出现,如果用到的类型却不能在这个场合出现就明显不合理了(可访问性不一致错误)
2 internal 修饰的类只能在当前程序集中被访问
3 静态成员 与 实例成员
静态方法调用的属性字段也必须是静态的
静态方法调用 类名.方法
实例方法只能实例化之后调用 并且也没法调用静态方法
静态方法里面不能直接调用实例成员
实例方法中可以调用静态方法
静态成员属于类所有,非静态成员属于类的实例所有
C#静态方法属于类所有,类实例化前即可使用
在实例方法中可以直接调用静态方法,
在静态方法中不可以直接调用实例方法
静态方法和静态变量创建后始终使用同一块内存(静态存储区),而使用实例的方式会创建多个内存
class Student
{
private static string name;
public static string Name
{
get { return name; }
set { name = value; }
}
//静态方法
public static void SayHi()
{
//静态方法里面不能直接调用实例成员
Console.WriteLine("我是"+name);
}
//实例方法
public void Test()
{
//实例方法中可以调用静态方法
SayHi();
}
}
{
private static string name;
public static string Name
{
get { return name; }
set { name = value; }
}
//静态方法
public static void SayHi()
{
//静态方法里面不能直接调用实例成员
Console.WriteLine("我是"+name);
}
//实例方法
public void Test()
{
//实例方法中可以调用静态方法
SayHi();
}
}
static void Main(string[] args)
{
//静态方法调用 类名.方法
Student.SayHi();
//实例方法只能实例化之后调用 并且也没法调用静态方法
Student stu = new Student();
stu.Test();
}
{
//静态方法调用 类名.方法
Student.SayHi();
//实例方法只能实例化之后调用 并且也没法调用静态方法
Student stu = new Student();
stu.Test();
}
4 多态:
不同的对象调用同一个方法 做出的行为是不一样的
多态就是指不同对象收到相同消息时,会产生不同行为,同一个类在不同的场合下表现出不同的行为特征
多态的作用:把不同的子类对象都当作父类来看,可以屏蔽不同子类对象之间的差异,写出通用的代码,做出通用的编程,以适应需求的不断变化。
里氏替换原则: 父类引用指向子类的对象 父类对象不能够替换子类
关键字 is as
//里氏替换原则: 父类引用指向子类的对象 父类对象不能够替换子类
//让父类引用指向子类对象
//让父类引用指向子类对象
Person p2 = new Student("张三", 13, "男");//一个学生是一个人
if (p2 is Student)//判断p2是否为student类型
{
Console.WriteLine("学生");
}
Student s = p2 as Student;//as 类型转换 只能转换引用类型 将p2转换为student类型
if (p2 is Student)//判断p2是否为student类型
{
Console.WriteLine("学生");
}
Student s = p2 as Student;//as 类型转换 只能转换引用类型 将p2转换为student类型
Person p3 = new Teacher("张三", 13, "男");
Student s2 = p3 as Student;//这样转换会出错 因为P3是基于teacher类型 s2会为null
if (s2!=null)//防止报错
{
s2.SayHello();
}
Student s2 = p3 as Student;//这样转换会出错 因为P3是基于teacher类型 s2会为null
if (s2!=null)//防止报错
{
s2.SayHello();
}