黑马程序员-面向对象复习2
来源:互联网 发布:抓娃娃机h5源码下载 编辑:程序博客网 时间:2024/05/22 09:37
------- Windows Phone 7手机开发、.Net培训、期待与您交流! -------
继承:
继承描述现实世界中相互包括的对象之间的关系,如人类包括中国人和美国人,中国人包括东北人和南方人,灵长类包括人和大猩猩,哺乳动物包括灵长类和其他来,这种关系的抽象叫做继承关系。
C#中只允许单继承,但允许继承多个接口,下面是一个继承的实例:
Class Person{
int age;
string name;
public void talk(){
console.writeline("大家好我的名字叫做"+this.name);
}
}
Class student : Person{
// 暂时为空
}
虽然student目前是空白,但它已经从Person类继承了一个方法和两个字段如果这两个字段是公共的,我们可以调用子类的talk方法来输出学生的姓名。
从底层的角度看,继承的实现是一个拼接的过程,子类新添加的字段和方法被放在父类的后面,而this指针总是指向父类的第一个元素(也可能不是,但位置一般固定),继承之后,原来父类的字段可以“看成”是子类的字段,各字段的访问是隐含的this指针加上偏移量来完成了。
而类中的方法,无论静态还是动态,一般和类的字段分开存放,不计入类的总大小之内。
子类可以添加新方法和字段:
Class student : Person{
string school number;
public void gotoschool(){
...
}
}
也可以覆盖基类的方法,但要注意,覆盖时,父类的方法必须是虚方法,子类的方法必须加上override关键字:
Class Person{
int age;
string name;
public virtual void talk(){
console.writeline("大家好我的名字叫做"+this.name);
}
}
Class student : Person{
public override void talk(){
console.writeline("老师您好,我的名字叫做"+this.name);
}
}
方法的覆盖和多态的实现有密切关系,稍后介绍,下面要复习的是构造方法构造方法是一种特殊的方法,它没有返回值而且和类名相同,类的实例通过构造函数进行类的初始化,一个类必须有构造函数,即使不显式的写出,编译器也会自动调用一个没有参数和具体实现的构造函数,如果写出显式的构造函数,那么系统默认的无参构造函数就不会被执行,构造函数可以被重载:
Class Person{
int age;
string name;
Person(){
}
Person(int age,string name){
this.name=name;
this.age=age;
}
public virtual void talk(){
console.writeline("大家好我的名字叫做"+this.name);
}
}
构造方法不需要被显式的继承,但有一点要注意,子类在调用自己的构造方法之前,会隐式的调用父类的无参构造方法(因为只有父类被构造完才能构造子类),如果父类中给出了有参数构造方法而没有给出无参构造(这时原始的无参构造被隐藏),编译器会报出一个缺少“0参数构造方法的错误”:Class Person{
int age;
string name;
Person(int age,string name){
this.name=name;
this.age=age;
}
//没有无参数的构造方法public virtual void talk(){
console.writeline("大家好我的名字叫做"+this.name);
}
}
Class student : Person{
student(){
...
}
public override void talk(){
console.writeline("老师您好,我的名字叫做"+this.name);
}
}
这时编译器会报错,正确的做法是在子类构造方法后加上base来调用父类的有参构造方法:Class Person{
int age;
string name;
Person(int age,string name){
this.name=name;
this.age=age;
}
public virtual void talk(){
console.writeline("大家好我的名字叫做"+this.name);
}
}
Class student : Person{
student()base(0,null) {
...
}
public override void talk(){
console.writeline("老师您好,我的名字叫做"+this.name);
}
}
base类似于java中的super方法,用于从子类中调用父类的方法和使用父类的字段,调用构造函数用base(),一般方法用base.方法名 ()------- Windows Phone 7手机开发、.Net培训、期待与您交流! -------
- 黑马程序员-面向对象复习2
- 黑马程序员-面向对象复习
- 黑马程序员----【javaSE基础】复习--面向对象
- 黑马程序员---面向对象的复习
- 黑马程序员——C#面向对象基础复习日记
- 黑马程序员_java基础复习二面向对象
- 黑马程序员 java基础复习二 之面向对象
- 黑马程序员-面向对象基本知识复习(1)
- 黑马程序员_面向对象编程基础复习
- 黑马程序员--java基础复习之面向对象
- 黑马程序员_java复习笔记1-面向对象
- 黑马程序员——面向对象的总结复习
- 黑马程序员—java基础复习—面向对象
- 黑马程序员---面向对象2
- 黑马程序员---面向对象2
- 黑马程序员-面向对象2
- 黑马程序员--面向对象2
- 黑马程序员-面向对象2
- ThoughtWorks技术雷达(2012年03月)
- hdu3397
- Linux下crontab命令的用法
- java.lang.ArrayIndexOutOfBoundsException: 3184
- 电话服务流程
- 黑马程序员-面向对象复习2
- Eclipse调试Bug的七种常用技巧
- 开源搜索引擎介绍
- Ant解析
- cpuid调用示例
- linux学习笔记之 初识linux
- DIV高度设置为1,显示出来变高
- 输入一个数组,对数组进行排序,并输出该数组中重复元素出现的次数
- hadoop源码分析(MapReduce)