在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;
}