老黑讲Java之面向对象开发——方法的重写
1、温故知新
前段时间老黑介绍了面向对象三大特征之一——继承,这次让我们简单温习一下吧。
佛家有云,有因必有果,那么继承的诞生究竟有什么意义呢,我们可以通过结果来推测因由,现在看看继承的特点。
首先,继承的机制渗入Java编程语言体系结构,俗话说,Java一切皆继承。这样程序员只要了解父类,对于其所有子类的调用心里就可以明白一二了。
其次,继承可以减少开发时间成本,减少无意义开发,代码便于管理。假如我们在负责一个中大型项目时,这时项目架构师的作用尤为重要,选择适合客户经理的业务需求的框架,还有最重要的是处理好父类,剩下的就可以让码农继承开发去了。
继承还有许多优点不一一赘言,因为继承机制好,所以有存在的意义,更值得我们学习。
2、继承的泛化过程和extends关键字
将重复的代码提取出来,放在一个公共类中这个过程称为泛化,通常这个过程在设计初期完成。
使用extends关键字,使得子类继承父类,伪代码如下:
class 子类 extends 父类{
}
3、方法的重写
子类继承父类后,当然子类可以继承父类的方法,还有更重要的一点,子类可以重写父类的方法,即子类的方法名和参数列表与父类的方法如出一辙,但方法的实现不同(相同的话没有必要重写哦>_<'')。
接下来重点来了,请认真理解,无论父类型还是子类的引用调用子类重写之后的方法,JVM运行的都是子类重写的方法。明白这句话,方法的重写你就学妥了,先插播一段代码如下:
父类代码如下:
public class Father {
private String name;
private String age;
private String gender;
public void sayRole() {
System.out.println("我是爸爸");
}
}
子类代码如下:
public class Son extends Father {
public void sayRole() {
System.out.println("我是儿子");
}
public static void main(String[] args) {
Father father = new Son();
Son son = new Son();
father.sayRole();
son.sayRole();
}
}
运行结果是:
我是儿子
我是儿子
解析:从结果看来,无论是子类的引用还是父类的引用调用重写之后的方法,运行的方法都是子类重写后的方法。实际上,方法的重载是运行期的过程,java在运行后,才会创建对象,根据对象调用相应的方法。
1、语法上的区别
有许多人,重载(overlaod)和重写(override)傻傻分不清,这两个概念是Java面试常考题目。无论怎样,要想分清他们俩看这篇文章绝对够用了。
1、重载是在一个类中定义方法名相同但参数列表不同的方法,如下伪代码:
public void 支付(储蓄卡){}
public void 支付(储蓄卡, 信用卡, 微信, 支付宝){}
2、重写是指子类继承父类后,子类中定义与父类完全一样的方法,如下伪代码:
public 父类{
public void car(){ 我能开汽车}
}
public 子类 extends 父类{
public void car(){我能开大型货车}
}
分析:重载是在一个类中定义的方法,重写是在几个类中定义的方法。
2、示例代码
重写代码:
public class Super {
public void say() {
System.out.println("我是父类");
}
}
class Sub extends Super{
public void say() {
System.out.println("我是子类重写方法");
}
}
重载代码:
class Goo{
public void start(Super sup) {
System.out.print("父类开始说");
sup.say();
}
public void start(Sub sub) {
System.out.print("子类开始说");
sub.say();
}
}
测试代码:
Super sup = new Sub();
Sub sub = new Sub();
Goo g = new Goo();
g.start(sup);
g.start(sub);
运行结果是:
子类开始说:我是子类重写方法
父类开始说:我是子类重写方法
3、运行过程上的区别
重载属于编译器绑定,即java在编译时根据方法的参数列表判断去调用哪个方法;
重写属于运行期绑定,即java在运行期根据引用变量类型指向的对象类型判断调用哪个方法。