类为什么要初始化,这要追溯到程序员经常不太注意的一个问题,是忘记初始化变量,尤其是C程序员。常常会因为某个变量未被初始化而引发不可预知的错误。

  当然,C语言中不涉及到类的概念,但是,在C++和Java中,引入了构造器这种概念来解决这个问题。构造器是用来做初始化的工作的,如果程序员忘记在建类的时候加上构造器,则编译器会自动创建构造器。为了调用 方便,采用与类名相同的名称来定义默认构造器的名称。有了默认构造器,保证了我们在调用方法之前,它已经被初始化了。

  在实际的开发中,为了让程序员按自己的需求来创建类的实例对象,采用重载构造方法,来定制不同的实例对象。程序员可以根据实际情况,创建不同的构造器,这样,在使用类之前,可以用不同的参数来新建对象,在这里,用到了刚刚提到的方法重载功能。

  方法重载:通俗来讲是,在同一个类中,两个方法名称相同,参数不同(此处参数的不同,包括参数的个数不同,或者是参数的类型不同,甚至是参数的顺序不同)。此处有一个容易让人产生幻觉的地方,是,是不是可以以两个方法的返回值不同来区分方法重载?不可否认,我以前也这样怀疑过,找了资料,大家说什么的都有,后来,自己亲自做了实验,写了一小段代码测试出来了,结果是:不可以,返回值的不同是不能用来区分方法重载的。因为从理论上讲,我们设想一下,实际情况中,总是方法调用在前,返回值在后,如果有两个方法,只有返回值不同,那么编译器在调用它们的时候,是看不出它们有什么不同的(只有在方法执行完后才知道),因此只能把它们当做是相同的方法,因此肯定是通不过的。所以说,实验很重要,建议大家在写程序的时候,如果遇到模棱两个的东西,一定要动手做实验,这样才能获得正确的知识。

  方法覆写:与方法重载来做区分的另一个技术是方法覆写,覆写是指,在两个类中(一般是指继承过程中的基类和派生类),方法名相同,参数也相同的两个类(注意区分和重载不同的地方)。这样多数用在继承中,父类通过提供接口,子类覆写这个接口,用来实现不同的功能,也是C++里面多态的实现原理,当然多态的内部细节比较复杂。

  方法隐藏:是与方法覆写来区分的,还是两个类,如果方法名相同,参数相同,且基类无virtual关键字,实现了方法隐藏,派生类屏蔽了基类的函数

  总结一下:

  Java中:

  重载:是在同一个类中,两个方法名称相同,参数不同

  覆写是:在两个类中,方法名相同,参数也相同的两个类

  C++中:

  重载:是在同一个类中,两个方法名称相同,参数不同

  覆写是:在两个类中,方法名相同,参数也相同的两个类,且基类函数必须有virtual关键字,若无virtual关键字,则为隐藏。

  隐藏是指:如果方法名相同,参数不同,不论基类有无virtual关键字,后都实现了方法隐藏。

  (如果派生类的函数与基类的函数同名,但是参数不同。此时,若基类无virtual关键字,则肯定是隐藏。但是如果派生类的函数与基类的函数同名,但是参数不同。此时,若基类有virtual关键字,基类的函数将被隐式继承到派生类的vtable中。此时派生类vtable中的函数指向基类版本的函数地址。同时这个新的函数版本添加到派生类中,作为派生类的重载版本。但在基类指针实现多态调用函数方法时,这个新的派生类函数版本将会被隐藏)

  如果方法名相同,参数相同,且基类无virtual关键字,实现了方法隐藏。

  貌似很复杂,我们一定要理清啊!