关于JAVA继承、多态、抽象类、接口等性质的学习(2)
关于多态,先看一个简单的例子
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,最后子类创建的对象要指向父类的引用。

浙公网安备 33010602011771号