Net学习日记_基础提高_5

复习静态成员与实例成员?

1.静态成员属于类;1个类第一次被访问的时候,这个类下面的所有的静态成员会被加载到静态存储区。静态成员只存在一份。

public static int num;

2.实例成员属于对象;随着对象的创建而创建,被GC回收的时候。

private int num2 = "";

问题?静态方法为啥不能访问实例成员?

this关键字,base关键字不能在静态方法里使用。因此在静态方法中不能直接访问实例成员。

第一次类的成员被访问的时候,静态构造函数执行。

只执行一次。

在执行第一次访问之前,限制性静态构造函数,在执行你的操作哦。

复习继承

继承的好处:

1.方便代码管理。子类可以拥有父类的非私有成员。为了多态

2.子类的构造函数,默认会去调用父类的无参数的构造方法。

3.显示指定子类构造函数调用的父类构造函数,base

4.创建子类对象的内存图

5.this可以点出子类的所有成员和父类的非私有成员,base可以点出父类的非私有成员。

6.单根性,传递性

7.IS A

里氏替换原则LSP

子类可以替换父类的位置,并且程序的功能还不受影响。

Person p = new Student();

父类有的功能子类都有,所以不影响程序的功能。

父类变量指向了1个子类对象。

Person p = new Student();

指针指向谁,是运行时绑定。

类型指针指向谁,是根据其类型对象而决定的。

当1个父类变量指向1个子类对象的时候,只能通过这个父类变量调用父类的成员,子类独有的成员无法调用。

Person p1 = new Student();

Person p = new Person();

//子类变量不能指向1个父类对象

//必须要有继承关系,才可以使用强制转换。

// 如果1个父类变量指向了1个子类对象,那么可以将这个父类变量转换成子类对象。

Student s1 = (Student)p1;

//如果1个父类变量指向的就是1个父类对象,将这个父类对象转换成子类对象会报异常。

//Student s0 = (Student)p;

is关键字判断是否是指定类型

bool b = p is Person;

b = p is Student; // 1个Person不一定是Student

b = p is Object;  // Person从Object继承

b = p is Program; // 没有继承关系,表达式的值永远都是false

//首先判断变量

if(p1 is Student)

{

   Student s2 = (Student) p1;

}

//as 转换 如果转换成功,引用指向s4;如果转换失败,不报异常,s4为NULL

Student s4 = p as Student;

虚函数(virtual关键字)(Java里面没有这个概念,因为子类均把父类覆盖掉)

允许子类把父类的同名方法替换掉

利用override在子类中,可以查看到在父类定义的虚方法

如果子类重写了父类的虚方法,那么通过父类变量来调用这个方法的时候会调用子类的。

class Person

{

  public virtual void SayHi()

{

Console.....

}

}

class Teacher:Person

{

public override void SayHi()

{

Console....

}

}

多态(很重要!!!)

同一种行为,对于不同的事务,有不同的表现形式。

多态表现一:将父类作为方法的参数

                     屏蔽多个子类的不同,将多个子类当成父类来统一处理。

继承:继承是为了多态,多态是为了扩展。

面向对象最终目的是为了开闭原则。

多态表现二:将父类类型作为返回值。

 多态是基于继承,所以没有继承,多态是无法实现的。

原文地址:https://www.cnblogs.com/lisong-home/p/7656503.html