Java三大特性(封装,继承,多态)之一 -----多态

目录

 

一、读前准备

1.参考文献

2. 主要涉及的知识

二、引言

1.多态的概念

2.多态的延申知识

3.多态主要关键字

三、多态设计方式

1.普通继承多态设计

代码如下:

 2.抽象类多态设计:

3.接口多态设计

四、多态的转型

1.向上转型:

2.向下转型:


 

一、读前准备

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:

  • 多态介绍了三种设计方法,对不同的需求选择不同的设计方法,
  • 该文章的主要内容是文字,篇幅有限,并没有补充太复杂的代码,读者可以自行扩展
  • 该文章总感觉少了点东西,后续补充
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值