浅谈java中的多态
程序员文章站
2024-02-09 18:05:30
...
浅谈java中的多态
学习了java一年的时间,这里对java的多态进行了一个总结,如有错误希望可以指出,
首先java的多态分为编译时的多态和运行时的多态,其中编译时的多态就是方法的重载(前期绑定),在编译时确定具体调用哪个方法,运行时多态(后期绑定)也就是常说的多态性,是面向对象的精髓,只有在程序运行的时候才能够确定具体调用哪个方法。
编译时的多态:
public class A{
public void show(){
System.out.println("这里是无参数的show方法");
}
public void show(String s1){
System.out.println("这里是一个参数show方法 第一个参数是 :"+s1);
}
public void show(String s1,String s2){
System.out.println("这里是两个参数的show方法 第一个参数是 :"+s1+" 第二个参数是: "+s2);
}
}
public class Test{
public static void main(String[] args){
A aa=new A();
aa.show();
aa.show("编译");
aa.show("编译","运行");
}
}
运行结果:
这里是无参数的show方法
这里是一个参数show方法 第一个参数是 :编译
这里是两个参数的show方法 第一个参数是 :编译 第二个参数是: 运行
上述例子中对象aa调用show方法,通过传入的参数不同编译器可以确定具体调用哪个方法,因此每一个重载的方法必须要有一个独一无二的参数列表。这也就是方法重载的基本规则,那么重载的时候返回值的不同是否可以作为区分重载的标准呢?答案是否定的,因为并不是每一次调用方法时都会用到返回值,因此编译器无法通过返回值进行区分,但是重载的两个方法的返回值是可以不同的。
运行时的多态
public class A{
public void show() {
System.out.println("这里是A类的show方法");
}
}
public class B extends A {
public void show() {//重写父类中的方法
System.out.println("这里是B的show方法");
}
}
public class Test{
public static void main(String[] args){
A a=new A();
B b=new B();
a.show();//第一次
b.show();
a=b;
a.show();//第二次
}
}
运行结果
这里是A类的show方法
这里是B的show方法
这里是B的show方法
这就是神奇的多态性,两次调用a.show(),却产生了不同的效果,第一次调用使用的是父类中的方法,第二次却使用的是子类中的方法,产生这样的原因是 a=b;(将子类在堆中的地址赋值给父类的引用)这一语句,将父类引用指向了子类的对象,这是一种向上转型,这种多态性的三个必要条件:
1.要有继承 。
2.要重写父类中的方法 。
3.父类的引用指向子类的对象。
我的理解:多态的意义就是对刺激的不同反应,比如拿到60分的卷子不同的人会有不同的反应,有的同学会很高兴,因为考试及格了不需要补考,而有的同学则会觉得自己考得很少,没有发挥好。