欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

浅谈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分的卷子不同的人会有不同的反应,有的同学会很高兴,因为考试及格了不需要补考,而有的同学则会觉得自己考得很少,没有发挥好。