Java中多态的理解总结

多态:polymorphism

多态: poly + morphism 许多形态
在希腊语中,poly指的是许多,morphism指的是形态

其中多态包括:
编译时多态
运行时多态

编译时多态:

在编译时决定编译所需要使用的目标方法。通常是父类所决定

运行时多态:

在运行时决定运行所需要使用的目标方法,通常是子类所决定,如果子类没有重写父类该方法,那么将使用父类的方法。

其实编译时多态和运行时多态就是我们常说的,编译看父类,运行看子类,在使用多态的时候,编译时应注意父类有无声明该方法,若无声明,那么将编译报错。

举例体现多态

创建一个父类

package Fs;

public class Father {
	void eat () {
		System.out.println("father eat");
	}
	void sleep() {
		System.out.println("father sleep");
	}
}

创建一个子类1,只重写父类的eat方法

package Fs;

public class Son_1 extends Father {

	@Override
	void eat() {
		
		System.out.println("son1 eat");
	}
	
}

创建一个子类2,重写父类的eat和sleep方法

package Fs;

public class Son_2 extends Father {

	@Override
	void eat() {
		
		System.out.println("son_2 eat");
	}

	@Override
	void sleep() {
		
		System.out.println("son_2 sleep");
	}
	
}

创建一个运行类:

package Fs;

public class Run {

	public static void main(String[] args) {
		System.out.println("=========父类对象==========");
		Father f1 = new Father();
		f1.eat();
		f1.sleep();
		System.out.println();
		System.out.println("=========子类对象赋予父类引用,son1子类只重写eat方法=========");
		Father f2 = new Son_1();
		f2.eat();
		f2.sleep();
		System.out.println();
		System.out.println("=========子类对象赋予父类引用,son2子类重写eat和sleep方法=========");
		Father f3 = new Son_2();
		f3.eat();
		f3.sleep();
	}

}

测试结果:由测试的结果,我们可以看到,当子类只重写了父类部分方法的时候,通过多态调用该方法,编译时候会先检查父类的该方法,编译通过以后,运行时检查子类有无重写该方法,如果有,那么将使用子类重写后的方法,没有则将使用父类的方法。

=========父类对象==========
father eat
father sleep

=========子类对象赋予父类引用,son1子类只重写eat方法=========
son1 eat
father sleep

=========子类对象赋予父类引用,son2子类重写eat和sleep方法=========
son_2 eat
son_2 sleep

多态的运用更多是在父类有通用的方法,子类对父类的方法有n种改写需求的时候,例如打游戏的时候,有兵种(父类)攻击方式(父类方法),这时候玩家就可以选择不同的兵(子类),然后就会用不同的攻击方式(子类方法)。

很多时候,多态的理解,建议还是自己写几个类感受一下。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章