zoukankan      html  css  js  c++  java
  • 0基础学java_面向对象之多态

    对象的多态性

    多态性是在面向对象中一个最重要的概念,在Java中面向对象主要有以下两个表现:
    方法的重载和重写
    对象的多态

    对象的多态性主要分为以下两种类型:

    向上转型:子类对象—>父类对象,对于向上转型,程序会自动完成,格式为

    父类 父类对象 = 子类实例;

    向下转型:父类对象—>子类对象,对于向下转型,必须明确的指明要转型的子类类型,格式为  子类 子类对象(子类)父类实例;

    举例:向上转型

     1 package company.feimao.package1;
     2 
     3 class O{
     4     public void fun1(){
     5         System.out.println("O--->public void fun1(){}");
     6     }
     7     public void fun2(){
     8         this.fun1();
     9     }
    10 }
    11 class P extends O{
    12     public void fun1(){
    13         System.out.println("P-->public void fun1(){}");
    14     }
    15     public void fun3(){
    16         System.out.println("P-->public void fun3(){}");
    17     }
    18 }
    19 public class PolDemo01 {
    20     public static void main(String args[]){
    21         P p = new P();
    22         O o = p;
    23         o.fun1();
    24     }
    25 }
    26 
    27  

    举例:向下转型

     1 package company.feimao.package1;
     2 
     3 
     4 
     5 class O{
     6 
     7     public void fun1(){//定义fun1()方法
     8 
     9         System.out.println("O--->public void fun1(){}");
    10 
    11     }
    12 
    13     public void fun2(){//调用fun1()方法
    14 
    15         this.fun1();
    16 
    17     }
    18 
    19 }
    20 
    21 class P extends O{
    22 
    23     public void fun1(){//此方法被子类覆写
    24 
    25         System.out.println("P-->public void fun1(){}");
    26 
    27     }
    28 
    29     public void fun3(){
    30 
    31         System.out.println("P-->public void fun3(){}");
    32 
    33     }
    34 
    35 }
    36 
    37 public class PolDemo01 {
    38 
    39     public static void main(String args[]){
    40 
    41         O o = new P();//向上转型
    42 
    43         P p = (P)o;//发生向下转型关系
    44 
    45         p.fun1();
    46 
    47         p.fun2();
    48 
    49         p.fun3();
    50 
    51     }
    52 
    53 }
    54  

    如果两个没有关系的对象之间发生了转换关系,则肯定会出现ClassCastException

    也就是说,如果想产生对象向下转型,则肯定必须先产生一个向上的转型关系“A a = new B();”表示建立关系。

    举例:

    涉及一个方法,此方法可以接受父类的任意子类对象,并调用方法。实现要求:
    1.不使用对象的多态完成
    2.使用多态完成

     1 package com.feimao.code;
     2 
     3 class H{
     4     public void fun1(){
     5         System.out.println("O--->public void fun1(){}");
     6     }
     7     public void fun2(){
     8         System.out.println("O--->public void fun2(211){}");
     9     }
    10 }
    11 class I extends H{
    12     public void fun1(){
    13         System.out.println("I-->public void fun1(152){}");
    14     }
    15     public void fun4(){
    16         System.out.println("I-->public void fun3(){}");
    17     }
    18 }
    19 public class PolDemo04 {
    20     public static void main(String args[]){
    21      fun1(new I());//传递I的事例
    22     }
    23     public static void fun1(I i){
    24         i.fun1();//覆写父类的中发fun1()方法
    25         i.fun2();
    26     }
    27 
    28     }

    按照以上代码,每增加一个子类就颠写一遍父类方法,如果使用多态,不然增加多少子类,轻松搞定。

     1 package com.feimao.code;
     2 
     3 class H{
     4     public void fun1(){
     5         System.out.println("O--->public void fun1(){}");
     6     }
     7     public void fun2(){
     8         System.out.println("O--->public void fun2(211){}");
     9     }
    10 }
    11 class I extends H{
    12     public void fun1(){
    13         System.out.println("I-->public void fun1(152){}");
    14     }
    15     public void fun4(){
    16         System.out.println("I-->public void fun3(){}");
    17     }
    18 }
    19 public class PolDemo04 {
    20     public static void main(String args[]){
    21      fun1(new I());//传递I的事例
    22     }
    23     public static void fun1(H h){
    24         h.fun1();//覆写父类的中发fun1()方法
    25         h.fun2();
    26     }
    27 
    28     }

    子类覆写父类方法,优先访问子类方法,如果子类方法不存在或者不能访问,才会访问本类即父类方法。

  • 相关阅读:
    使用自制事务进行异常信息的记录:Autonomous transactionslog
    backup methodsexp and imp
    一个 SQL 同时验证帐号是否存在、密码是否正确
    使用存储过程进行分页:page by Procedure
    推荐一款类似于editplus的文本编辑工具:note++
    myeclipse8.5反编译插件的安装使用jdgui插件
    [转]JavaMail的使用之邮件发送 详解
    Thinking in java中内部类的例子。
    [转]tomcat6.0下的log4j日志文件配置过程
    127.X.X.X開頭的網路都是特殊用途的嗎!?
  • 原文地址:https://www.cnblogs.com/feimaoyuzhubaobao/p/9834088.html
Copyright © 2011-2022 走看看