博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
深入类的初始化和方法重载(一)
阅读量:6815 次
发布时间:2019-06-26

本文共 1463 字,大约阅读时间需要 4 分钟。

hot3.png

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

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

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

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

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

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

总结一下

Java中:

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

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

C++中:

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

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

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

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

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

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

转载于:https://my.oschina.net/xtfggef/blog/59675

你可能感兴趣的文章
JPA(四)之实体关系一对一
查看>>
如何使用羊驼自动生成缩略图的功能。
查看>>
定制化Azure站点Java运行环境(1)
查看>>
inotify用法简介及结合rsync实现主机间的文件实时同步
查看>>
Docker学习笔记之存储篇
查看>>
Python 获取CentOS7的内存使用率并写入mysql
查看>>
IIS:错误处理
查看>>
php 判断手机登陆
查看>>
git 问题
查看>>
Fedora18设置终端快捷键 和 桌面快捷方式
查看>>
取消NavigationBar左右两边的空隙
查看>>
Ubuntu 12.04 Gedit中文乱码解决办法
查看>>
修改symfony sfDoctrineGuardPlugin验证密码的方法
查看>>
Vbird的Linux私房菜学习笔记之正则表达式-特殊字符
查看>>
数据的作用域
查看>>
js中括号用于自执行测试
查看>>
svn迁移至git
查看>>
springMVC 表单联动处理 点击radio联动改变select选项
查看>>
Nagios开发自定义插件check_netstat
查看>>
浅谈@RequestMapping @ResponseBody 和 @RequestBody 注解的用法与区别
查看>>