目录
定义
多态就是指程序中定义的引⽤变量所指向的具体类型和通过该引⽤变量发出的⽅法调⽤在编译时并不确定,⽽是在程序运⾏期间才确定。(注意:成员变量没有多态性后面会讲到)
分析:
多态的主体指的是对象变量也就是对象的引用 A a1=new B( ); 指的是这里的变量a1。
只有在变量调用方法的时候才可能存在多态,成员属性比如a1.num不存在多态。
调用方法的结果在编译时并不确定,运行时确定,也叫做动态绑定。
多态的条件
1.继承
2.重写
3.父类引用子类对象
4.调用所重写的方法
用代码举个例子让大家认识这四个概念
class A {
public String show(D obj) {
return ("A ");
}
}
//继承
class B extends A{
//重写
public String show(){
return ("B");
}
}
public class Test {
public static void main(String[] args) {
A a1 = new B();//父类引用创建并指向子类对象
A a2 = new A();
B b1 = new B();
//向上转型:子类对象变量赋给父类对象变量完成向上转型
a2=b1;
//调用重写方法
a2.show();
a1.show();
}
}
如代码中的注释:
B 继承 A满足了继承的条件
B 中重写了 A中的show方法 完成了重写
下列代码块分别完成了父类引用子类对象
A a1 = new B( );
a2 = b1;向上转型
最后调用重写方法行成运行时多态;
多态的实现
- 实现同一个接口,不同的实例,相同的动作,干不一样的事。
- 继承同一个父类,重写父类方法,干不同的事。
多态的总结
说了这么多可能大家有点绕昏了
下面说一下自己的理解:
如果遇到可能是多态的情况下,需要判断结果的时候
举个例子:
class Father {
public String num = "父类成员变量";
public void showInFu() {
System.out.println("调用的是父类未重写方法");
}
public void show() {
System.out.println(this.num);
}
}
class Child extends Father
{
public String num = "子类成员变量";
public void show (){
System.out.println(this.num);
}
}
public class Demo2 {
public static void main(String[] args) {
Father f = new Child();
System.out.println(f.num);
f.showInFu();
f.show();
}
}
有继承
有show()函数的重写
出现了父类引用子类对象,则考虑会不会有多态的使用。
先看第一个
f.num
前文说到成员变量不属于多态的使用情况,则num=父类成员变量。
f.showInFu();
此方法没有在子类Child中重写所以不属于多态的使用情况,只是一次简单的父类中方法调用。
f.show();
此方法在子类中重写了,所以属于多态的使用情况。
程序运行结果
父类成员变量
调用的是父类未重写方法
子类成员变量Process finished with exit code 0
一句话
调用的方法是否为重写,是则为多态,否则不能为多态。
其他情况
这是多态的常用情况,涉及到方法参数不同带来的多态,容易产生混淆的情况可以参考这篇文章:
https://www.cnblogs.com/chenssy/p/3372798.html
如果想透彻得弄明白,需要接触到JVM虚拟机,看完这个你就会完全掌握了。