目录
1.A类和B类都写一个相同的方法,先用static,两边都是一样的:
2.A类和B类都去掉static,出现了两个圆圈的符号,代表重写:
3.总结
4.为什么需要重写?
代码演示:首先new一个A类和B类,A类继承B类,B是父类。
1.A类和B类都写一个相同的方法,先用static,两边都是一样的:
重写都是方法的重写,和属性无关。
在Application中new一个A类的对象a,用来调用A类的test( )方法:
结果:
再写B b = new A(); 对象b用来调用B类的test( )方法。父类的引用指向了子类:
结果:
因为方法的调用只和左边定义的数据类型有关,和右边的new A( ) 没有关系。
2.A类和B类都去掉static,出现了两个圆圈的符号,代表重写:
把A中写的方法删掉,然后快捷生成重写方法:alt+insert ,选择B类的test方法。
生成结果如下。@Override 是有功能的注解!
默认调用父类的方法,我们可以写不同的方法体:
同样运行Application,结果截然相反,都是走的A类的方法:
这两种结果只和有无static有关:
有static时,b调用了B类的方法,因为b是用B类定义的
没有static时,b调用的A类的方法,而b是用A类new的
总结成一句话:静态方法是类的方法,非静态是对象的方法。
重写只能非静态方法,且只能是public类型的,否则不算重写。
重载是本类中,相同方法参数列表的不同;重写是子父类之间才存在:子类继承了父类,子类重写父类的方法。
3.总结
(1)重写需要有继承关系,子类重写父类的方法。
(2)重写,子类和父类的方法必须要一致:方法名必须相同,参数列表必须相同,方法体可以不同。
(3)子类的修饰符范围可以比父类扩大,不能缩小:public > protected > default > private
(4)重写可能会抛出异常,子类相较于父类抛出的异常范围可以被缩小,不能扩大。(子类比父类应该越来越优化,问题应该越来越少)e.g.ClassNotFoundException的总异常为Exception(范围更大)
(5)快捷键alt+insert 选override
4.为什么需要重写?
父类的功能子类不一定需要,或者不一定满足。