JAVA重载,覆盖,和重写的区别
重载:⽅法名相同,但参数不同的多个同名函数
注意:1.参数不同的意思是参数类型、参数个数、参数顺序⾄少有⼀个不同
2.返回值和异常以及访问修饰符,不能作为重载的条件(因为对于匿名调⽤,会出现歧义,eg:void a ()和int a() ,如果调⽤a(),出现歧义)
3.main⽅法也是可以被重载的
覆盖:⼦类重写⽗类的⽅法,要求⽅法名和参数类型完全⼀样(参数不能是⼦类),返回值和异常⽐⽗类⼩或者相同(即为⽗类的⼦类),访问修饰符⽐⽗类⼤或者相同
两同两⼩⼀⼤
注意:⼦类实例⽅法不能覆盖⽗类的静态⽅法;⼦类的静态⽅法也不能覆盖⽗类的实例⽅法(编译时报错),总结为⽅法不能交叉覆盖
隐藏:⽗类和⼦类拥有相同名字的属性或者⽅法时,⽗类的同名的属性或者⽅法形式上不见了,实际是还是存在的
注意:当发⽣隐藏的时候,声明类型是什么类,就调⽤对应类的属性或者⽅法,⽽不会发⽣动态绑定
⽅法隐藏只有⼀种形式,就是⽗类和⼦类存在相同的静态⽅法
属性只能被隐藏,不能被覆盖
⼦类实例变量/静态变量可以隐藏⽗类的实例/静态变量,总结为变量可以交叉隐藏
隐藏和覆盖的区别:
被隐藏的属性,在⼦类被强制转换成⽗类后,访问的是⽗类中的属性
java重写和重载的区别被覆盖的⽅法,在⼦类被强制转换成⽗类后,调⽤的还是⼦类⾃⾝的⽅法
因为覆盖是动态绑定,是受RTTI(run time type identification,运⾏时类型检查)约束的,隐藏不受RTTI约束,总结为RTTI只针对覆盖,不针对隐藏
特殊情况:
1.final修饰的属性可以被隐藏,但是不能被赋值,即不能⽤=来赋值,⽹上说final属性不能被修改,这个说法不准确,因为对于引⽤类型的变量⽤final修饰后,它只是不能被指向其他对象,但是可以改它
⾃⾝的值,可以⽤ArrayList测试,final属性可以在运⾏的时候进⾏初始化,但是不能不出现初始化语句
2.final修饰的⽅法不能被覆盖,可以被重载
3.final修饰的类不能被继承
4.private ⽅法隐式添加了final
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论