第二天
封装:
类和对象本身就是封装的体现;
1.属性封装了字段;
2.方法的多个参数封装成了一个对象
3.将一堆代码封装到了一个方法中;
4.将一些功能封装到了几个类中
5.将一些具有相同功能的代码封装到了一个程序集中(dll exe), 并且对外提供统一的访问接口. (属性名, 方法名)
继承 (是指类与类之间的关系)
Base class 基类 parent class 父类
Derived 派生类 child class 子类
继承的好处:
代码的重用;
Lsp里氏替换原则, 多态; (程序的可扩展性, 灵活性)
单根性, 一个类同时只能继承自一个类; C#中所有类都是继承自object类中
如果一个类没有继承自任何类,则默认继承自object类;
如果指定了当前类继承了某个类,则将覆盖默认的object类;
继承的传递性:
继承的时候,构造函数不能被继承;
子类中的构造函数会默认去调用父类中的无参数的构造函数;
如果父类中没有无参数的构造函数?
1修改错误方法:在父类中增加一个无参数的构造函数;
2如果不能在父类中增加, 就在父类中的构造函数后面加上 :base(“ ”, 10)
用于显示父类的某个构造函数;
Base 的作用1在父类中增加一个无参数的构造函数
构造函数不能被调用,可以用this
在本类中,调用其他构造函数用 :this( )
public Preson(string name, int age)
: this(name, age,null) //有多少的参数就要调用多少,没有值的参数可以用默认值代替
对象初始化器 ( )
集合初始化器
int[] fibarray = newint[] { 0, 1, 2, 3, 5, 8, 13 };
foreach (int i in fibarray)
{
Console.WriteLine(i);
}
在一般情况下如果子类继承了父类的成员,
那么在子类中,通过this. 成员或base. 成员都是访问的一样的;
Base是调用父类中的成员的,
修饰符 的使用
子类继承父类中的变量或方法时,父类中的私有成员是否能够继承
观点1 不能 但内存中都有,虽然子类继承父类后,在访问子类对象的时候,父类中的那些私有成员也被分配了内存(子类中也有) 但是,继承只是面向对象中的一个概念, 目的是为了子类使用(多态, 代码重用) 私有成员即便继承了,子类中也不能访问, 所以在面向对象中,继承了但不能访问,没有意义;
访问级别约束
子类的访问修饰符不能比父类的访问修饰符高,
类的访问修饰符和类方法的访问修饰符都高于【参数】的访问修饰符
类的访问修饰符和类属性或字段的访问修饰符都高于【参数】的访问修饰符
父类--子类--类方法--类属性--类参数
类的访问修饰符只能是public和internal //仅限程序员
要求方法参数的访问级别与方法本身的访问级别一致
属性的访问级别与属性的
实现多态的手段
对扩展开放,对修改关闭---------开放封闭原则
当一个方法是虚方法的时候,那么这个方法在子类中就可以被重写了, 子类继承父类以后,可以直接使用该方法,也可以将该方法重写;
public virtual void Show() //在父类中加上virtual ,在子类中才能对父类中的方法进行 { //重写,也就是实现
Console.WriteLine("父类中的Show方法");
}
}
public class Chinese : Person
{
public Chinese(string name)
: base(name)
{ }
public override void Show() //加上override可以对父类中的方法进行重写
{
Console.WriteLine("我叫: {0},我是中国人",Name);
}
}
1.子类如果要重写父类中的方法则需要在子类的方法前,加一个override
关于虚方法需要注意的几点:
1.父类中如果有方法需要让子类重写,则可以将该方法标记为virtual
2.虚方法在父类中必须有实现,哪怕是空实现。
3.虚方法子类可以重写(override),也可以不重写
在主程序中就可以写成:
Chinese cn1 = new Chinese("张三");
Riben rb2 = new Riben("jiangshang");
Meiguo mg1 = new Meiguo("jim");
Person[] cns = new Person[] { cn1, cn2, rb1, rb2, mg1 };
//遍历数组中的每个元素,
for (int i = 0; i < cns.Length; i++)
{
cns[i].Show(); //这里就是多态的实现
}
根据传入的不同, 而不用多处重写, 就能实现所要的效果,这就是多态
调用静态变量的时候,必须通过类名直接来调用,不能通过对象来调用,也就是说使用静态成员不需要实例化对象;
静态成员会在整个应用程序退出时,才释放资源,所以在整个程序中共享资源;
1.什么情况下要给一个类标记为静态类
一般情况是,当这个类是一个工具类, 里面都是方法, 为了让用户调用的时候方便,不需要实例化对象,这时可以将该类标记为static类 此时该类中值能包含静态成员,不能
包含实例成员. 比如 : convert, math ,file . . . .
2. 什么情况下需要在一个普通类中编写一个静态成员, 而这个类不能标记为static?
当这个类需要被实例化的时候, 如果这个类中有一个成员是所有对象都共享的数据这时可以将该类中的成员标记为静态的,但是这个类还是一个实例类;
静态类不能被实例化,不能被继承
由于静态成员会在整个程序退出时,才释放资源,所以尽量避免写静态字段或静态属性, 最好写静态方法;
当给一个普通类添加静态字段后,系统会默认为该类生成一个静态构造函数[[ 静态构造函数不能访问修饰符,并且也不能带参数]]
静态类的构造函数,只会在第一次使用静态类之前,执行,并且只会执行一次;
继承(多态) ,静态本身就是相反的;
Sealed :密封类,不能被继承; 可以禁止子类重写;