在java中,多态主要由以下两种表现方式:
1. 方法的重载(overload)
同一个方法中有多个同名的方法,但这些方法有不同的参数。因此在编译时,就可以确定到底调用哪个方法。它是一种编译时多态。重载可以被看做一个类中的方法多态性。
2. 方法的覆盖(override)
子类可以覆盖父类的方法,因此同样的方法会在父类和子类中有着不同的表现形式。 在java语言中,基类的引用变量不仅可以指向基类的实例对象,也可以指向其子类的实例对象。同时,接口的引用变量也可以指向其实现类的实例对象。这样就可以实现动态绑定。 这样就只有运行时才能确定调用哪个方法,因此通过方法覆盖实现的多态也可以被称为运行时多态。
子类覆盖(override)父类中的方法时,需要注意几点:
类中的方法有多态的概念,类中的成员变量没有多态的概念。
如下代码, 打印的结果是1, 成员变量的取值是父类还是子类并不取决于创建对象的类型,而是取决于所定义变量的类型,这是在编译期间决定的。
import org.junit.Test;
public class Base {
public int i = 1;
@Test
public void test(){
Base b = new Derived();
System.out.println(b.i);// b所属的类型是Base, b.i指的是Base类中定义的i
}
}
class Derived extends Base{
public int i = 2;
}