黑马程序员-面向对象复习2
2013-10-22 16:16
267 查看
-------
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;<
4000
/span>
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培训、期待与您交流! -------
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;<
4000
/span>
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培训、期待与您交流! -------
相关文章推荐
- 黑马程序员_java基础复习二面向对象
- 黑马程序员——java 面向对象复习笔记(二)
- 黑马程序员——java 面向对象复习笔记(一)
- 黑马程序员——C#面向对象基础复习日记
- 黑马程序员-面向对象复习
- 黑马程序员----【javaSE基础】复习--面向对象
- 黑马程序员-面向对象基本知识复习(1)
- 黑马程序员—— Java 基础 面向对象之继承 (复习)
- 黑马程序员_Java面向对象2
- 黑马程序员——第十天(Java面向对象-异常-包)
- 面向对象复习
- 黑马程序员_面向对象
- 黑马程序员_java面向对象思想学习总结
- 黑马程序员-----java面向对象思想总结*
- 黑马程序员-----java面向对象之封装、构造函数、this关键字、static静态总结*
- 黑马程序员--面向对象(二)
- 黑马程序员---java基础----面向对象总结
- 黑马程序员面试题面向对象一(封装,构造函数,this,static,单例设计模式,继承)
- 黑马程序员 D4 面向对象
- 黑马程序员—java面向对象一