跳至主要內容

多态

Yang大约 3 分钟JavaJava基础

多态:允许不同类的对象对同一消息做出不同的响应

  • 可以借由向上转型和动态绑定机制完成
  • 向上转型实现了将子类对象向上转型为父类类型
  • 动态绑定机制能识别出对象转型前的类型,从而自动调用该类的方法

分类

  • 编译时多态:又称设计时多态,通过方法重载实现
  • 运行时多态:程序运行时动态决定调用哪个方法,Java 中指的多态一般指的就是运行时多态

必要条件

  • 满足继承关系
  • 父类引用指向子类对象

向上转型

  • 语法:父类类型 父类引用 = new 子类类型(参数)

  • 又称隐式转型、自动转型

  • 父类引用指向子类实例,也表示子类对象可以赋值给父类的对象

  • 只能调用子类重写父类的方法以及父类派生的方法,无法调用子类独有的方法

  • 是安全的,因为任何子类都继承并接受了父类的非私有成员方法

  • 应用场景:多适用于有多个同父子类共同应用的场景,此时,可以借由父类引用,根据实际需要,转型为特定的子类对象实现多态

// Person
public class Person {
	public void eat() {
		System.out.println("是人就要吃饭");
	}
}

// Chinese
public class Chinese extends Person{
	public void eat() {
		System.out.println("中国人爱吃饺子");
	}
}

// French
public class French extends Person{
	public void eat() {
		System.out.println("法国人爱喝香槟");
	}
}

// Russian
public class Russian extends Person{
	public void eat() {
		System.out.println("俄国人爱吃列巴");
	}
}

// Test
public class Test {
	public void eat(Person person) {
		person.eat();
	}
	public static void main(String[] args) {
		Test test = new Test();
		test.eat(new Person());
		test.eat(new Chinese());
		test.eat(new French());
		test.eat(new Russian());
	}
}

向下转型

  • 在某些资料中也被叫做 强制类型转换
  • 必须转换为原始类型,不允许转换成非原始类型
  • 将子类的引用指向父类对象,此处必须进行强制类型转换
  • 可以调用子类独有的方法
  • 使用场景:一般用来重新获得因为向上转型而丢失的子类特性而存在,因此通常向下转型前需要先进行向上转型,向下转型通常也会结合 instanceof 一起应用,在灵活运用多态的基础上,同时兼顾子类的独有性,相较于直接创建子类实例,提高了代码的灵活性
Animal animal = new Cat();
Cat car  = (Cat)animal;

绑定机制

  • 将一个方法调用同一个方法所在的类连接到一起,Java 中存在静态绑定和动态绑定。
  • 静态绑定:指在程序运行之前进行绑定(由编译器和链接程序完成的),也叫前期绑定
  • 动态绑定:指在程序运行期间由 JVM 根据对象的类型自动的判断应该调用哪个方法,也叫后期绑定

instanceof

判断左边对象是否是右边类型的实例

if(one instanceof Cat){}
上次编辑于:
贡献者: sunzhenyang