Java三大特性(封装,继承,多态)之一 -----多态
目录
一、读前准备
1.参考文献
- Java编程思想,Java核心技术第八版(基础知识)
2. 主要涉及的知识
- Java继承,抽象类,接口,转型,构造器,重写,重载。
二、引言
1.多态的概念
- 多态通过分离做什么和怎么做,从另一个角度将接口和实现分离开来
- 多态方法调用允许一种类型表现出与其它相似类型之间的区别,只要它们是从同一个基类导出来,根据方法行为的不同而表现出来。
- 主要分为动态多态(方法覆盖,运行时问题)和静态多态(方法重载,编译时问题)
- 只有在运行的时候才会知道引用变量所指向的具体实例对象。
- 最终多态体现在:父类引用变量可以指向子类对象: father f=new son();
PS:不了解没关系,可以读完相关内容后再来复习
2.多态的延申知识
- 要想理解多态,就必须运用数据抽象和继承,
- 多态是一种不能单独看待的特性,必须与其它特性协调工作
3.多态主要关键字
- extends 普通继承时使用
- interface,implements 接口实现时使用
- abstract ,extends 抽象类继承使用
- instanceof 转型时使用配合继承
例如:A对象 instanceof B类 表示,A是否为B类的一个实例,A是父类引用变量,B是子类
三、多态设计方式
1.普通继承多态设计
代码如下:
import java.util.*;
class PC {
public void fun1(){
System.out.println("PC 的fun1.....");
}
}
class NotePc extends PC{
//重载了父类的fun1 方法
//注意,重载的条件取决于参数(个数,类型,顺序)
public void fun1(String a) {
System.out.println("NotePc 的 Fun1...");
}
public void fun2(){
System.out.println("NotePc 的Fun2...");
}
}
public class PolyTest {
public static void main(String[] args) {
PC w=new NotePc();
w.fun1();
//w.fun2();
}
}
结果如下 :
分析如下;
- 创建了一个PC父类,一个NotePC子类和PolyTest测试类,
- 子类重载了父类的fun1()方法,分别做上标记,且子类多一个fun2()方法
- 测试类用PC的引用变量w指向NotePc类实例化的对象。该引用变量可以调用fun()方法
- w引用变量不可以调用fun2()方法,会报错,因为fun2方法是子类的,父类的引用变量无法调用子类方法
- 若使用向下转型,可以以 ((NotePc) w).fun2();的方式调用fun2方法,不过需要进行instanceof转换,测试代码如下:
public class PolyTest { public static void main(String[] args) { PC w=new NotePc(); w.fun1(); if(w instanceof NotePc) { ((NotePc) w).fun2(); //等价于 NotePc n = (NotePc)w; n.fun2(); } else{ System.out.println("不可向下转型"); } } }
结果如下:
2.抽象类多态设计:
代码如下:
abstract class PC {
public abstract void fun1();
}
class NotePc extends PC{
@Override //重写抽象类的抽象方法
public void fun1() {
System.out.println("NotePc 的 Fun1...");
}
}
public class PolyTest {
public static void main(String[] args) {
PC w=new NotePc();
w.fun1();
}
}
结果如下:
分析如下:
- 抽象类和普通继承差不多,不同的是,需要使用到抽象类的情况下使用多态。按具体要求选择
3.接口多态设计
代码如下:
interface PC {
public abstract void fun1();
}
class NotePc implements PC{
@Override //重写抽象类的抽象方法
public void fun1() {
System.out.println("NotePc 的 Fun1...");
}
}
public class PolyTest {
public static void main(String[] args) {
PC w=new NotePc();
w.fun1();
}
}
结果如下:
分析同上,语法差不多,按需求选取实现方式
四、多态的转型
1.向上转型:
PS:多态的最终体现,也是最有意义的
- 父类引用变量指向子类实例对象
- 。但向上转型也有弊端,只能使用父类共性的内容,而无法使用子类特有功能,功能有限制
2.向下转型:
- 如上方代码中中:
public class PolyTest {
public static void main(String[] args) {
PC w=new NotePc();
w.fun1();
if(w instanceof NotePc) {
((NotePc) w).fun2(); //等价于 NotePc n = (NotePc)w; n.fun2();
}
else{
System.out.println("不可向下转型");
} } }
- 总的来说,需要用instanceof来判断是否可以向下转型。
PS:
- 多态介绍了三种设计方法,对不同的需求选择不同的设计方法,
- 该文章的主要内容是文字,篇幅有限,并没有补充太复杂的代码,读者可以自行扩展
- 该文章总感觉少了点东西,后续补充