欢迎使用CSDN-markdown编辑器

来源:互联网 发布:js鼠标悬停事件 编辑:程序博客网 时间:2024/06/05 00:29

多态的三个条件:
1.两个类有继承关系。
2.子类重写父类的方法。
3.父类引用指向子类对象。
继承、多态引入的两个关键字:
1.this:指向当前对象本身,不能用在静态方法中。
2.super:指向当前对象的父类,不能用在静态方法中。

代码:
父类.
public class Father {
public void show(){
System.out.println(“Father.show()”);
}
}

子类
public class Son extends Father {
public void show(){
System.out.println(“Son.show()”);
}
}

测试类.
public class Test {
public static void main(String[] args) {
Father fa=new Son();
fa.show();
}
}

这种很明显会调用子类Son的show()方法,输出结果为:
Son.show()
这里很明显的提现了多态的三个条件。
如果加入super和this关键字,有些人可能就要犯懵了,因为我就是那些人。。比如举个例子,代码如下。
父类:
public class Father {
public void show(){
eat();
}
public void eat(){
System.out.println(“Father.eat()”);
}
}
子类:
public class Son extends Father {
public void show(){
super.show();
}
public void eat(){
System.out.println(“Son.eat()”);
}
}
测试类:

public class Test {
public static void main(String[] args) {
Son son=new Son();
son.show();
}
}
这里并没有像第一次测试那样很明显的提现出父类引用指向子类对象。
很容易认为这里并没有多态,输出结果就是”Father.eat()”,但是结果却是”Son.eat()”。大致分析一下程序的运行过程:
第一步:main方法中创建子类引用指向子类对象,并调用子类show()方 法。
第二部:子类”show()”方法中用”super”关键字调用父类”show()”方法。
第三部:父类”show()”方法中调用”eat()”方法,前边是默认加一个”this”, 也就是”this.eat()”。
问题:那么输出结果是Father.eat()还是Son.eat()呢?这里的this指向当前对象本身,那么这个当前对象是父类对象还是子类对象?在创建子类对象的时候可以看成先生成一个父类的对象,再在父类对象外添加子类特有的属性和方法。比如在原有的一个卧室外边有包裹了一间大客厅,那么这个新的房子就是子类,它即有卧室的功能,又有客厅新加的功能,所以说子类功能要强于父类。内存可以大概这么画一下!这里写图片描述
当调用方法的时候,可以将JVM比作一个机器人,你就是这个机器人的主人,方法的调用就是你给机器人下达的指令。比如说,你和JVM站在房子外,你拿出一根烟对JVM说:“去我的卧室,用打火机把烟给烟点着“,然后JVM就颠颠的去了,路过客厅,走到卧室,点着烟,这里的打火机就是“方法”,烟就是”要处理的数据”比如成员变量或者局部变量什么的。。。
但是!如果在路过客厅的时候JVM看到了另一个你放在客厅的一模一样的打火机,不管它点着是蓝色的火还是红色的火(方法的重写),它都会用它去点烟,可能这个打火机的火大了,一下给烟烧掉一半,这都是你自己定的。这种就叫多态啦,你明明说让他去用卧室的打火机给你点烟,它在去卧室的途中看到一个和你描述的一模一样的工具,直接就用了。
那么得到的不是你想要的结果,你只是想把烟点着,而不是一下给烟烧掉一半,而这个JVM并不能自动分别卧室里的打火机和客厅的打火机的不同,你就要给它推到卧室门口说:”好了,你现在进入这个房间,给我的烟点着“JVM就进屋了,找到打火机并点着(调用父类的方法),而这个将它推到卧室门口而不是客厅门口的动作就相当于在方法前加了”super”关键字。而之前站在客厅门口是面对整间房子,也就相当于”this”。这里写图片描述
如果搞不太清楚多态以及this,super关键字的同学,不妨试着用我这种方式去理解一下,希望对大家有帮助,如果有错误,希望大神指正!谢谢!

原创粉丝点击