关于多态,先看一个简单的例子
class A{ public void A1(){ System.out.println("1"); } public void A2(){ System.out.println("2"); } } public class Test2 extends A{ public Test2() { // TODO Auto-generated constructor stub } public void A1(){ System.out.println("3"); } public void A2(){ System.out.println("4"); } public static void main(String[] args){ Test2 t1 = new Test2(); A t2 = new Test2(); t1.A1(); t1.A2(); t2.A1(); t2.A2(); } }
从上面例子可以看出,子类重写了基类的A1(),A2()方法,之后分别建立了两个子类对象,将其中一个赋给子类型的引用t1,另外一个赋给基类型的引用t2。接下来对两个引用分别调用A1、A2方法。
3
4
3
4
上面是输出结果,t1因为是test2类型所以正确的显示出了子类A1,A2方法的结果。但是接下来t2是基类型的,看起来应当输出的是基类A1,A2方法的结果,但是编译器却是输出了子类A1,A2方法的结果。实际上这就是多态性的体现,这里要提到后期绑定这个
概念,后期绑定是由编译器完成的,在编译时,编译器不需要获得任何特殊信息就能进行正确的调用。
简单来说就是:父类型的引用可以指向子类型的对象。
还有就是当用父类的引用调用一个父类没有的方法是,要对其进行强制类型转换,例如
A t1 = new Test1();
Test1 t3 = (Test1)t1;
t3.A3(); // 这里的A3假设为子类特有的方法。
套用java编程思想的话说,多态是一项让程序员“将改变的事物与未变的事物分离开来”的重要技术,我们所做的代码修改,不会对程序中其他不应受到影响的部分产生破坏。
注:静态方法只能继承而不能重写,也就是说子类继承了基类的静态方法后,如果调用的话,要视此时的引用是基类型还是子类型,是什么类型的引用就调用谁的方法。
最后总结一下多态的特性:
首先得有继承关系存在,接下来基类的方法是要被重写的,而且该方法必须是public,最后子类创建的对象要指向父类的引用。
时间: 2024-10-11 00:51:01