zoukankan      html  css  js  c++  java
  • Javase中多态polymorphic的简单介绍

    -------------多态-----------------
       (1)面向对象三大核心思想;
           1、封装 2、继承 3、多态
       (2)多态定义:父类的引用指向子类的对象。
         (3)引用指的是父类声明的一个引用型变量,变量有: 1、成员变量
                               2、静态变量
                               3、构造方法的变量
                               4、普通方法的变量
                               5、声明就用的变量
       (4)变量的声明一般来说需要三步:声明数据类型 声明变量名 赋值
         但是严格来讲为两步:声明数据类型 声明变量名
       (5)赋值有两种情况:1、父类型声明,赋值一个父类型的引用值
         父类型声明,赋值一个子类型的引用值
                 2、多态
       (6)里氏替换原则:能使用父类的地方,一定可以使用子类
       (7)多态的概念:
         编译阶段,将父类的属性,生成属性列表,编译时绑定
         运行阶段,将子类生成一个对象,子类也有自身属性列表,运行时绑定
         程序运行时,通过父类的属性去调用子类对象的属性(特指成员方法)
       (8)具体调用:运行阶段
         1、遍历父类的属性列表
         2、遍历子类的属性列表
         3、如果子类有相同,就调用子类的,没有就调用父类的
         4、如果父类没有所指属性,直接报错,子类中不用去

    public class Poly01{
        public static void main(String[] args){
            Big a = new Big();
            a.eat();//输出父类
            Big b = new Small();
            b.eat();//输出子类
            //b.happy();//报错:找不到符号
            b.cry();//输出父类
        }
    }
    
    class Big{
        public void eat(){
            System.out.println( "大的吃小的" );
        }
        public void cry(){
            System.out.println( "大的在哭" );
        }
    }
    class Small extends Big{
        public void eat(){
            System.out.println( "小的不让大的吃" );
        }
        public void happy(){
            System.out.println( "小的很高兴" );
        }
    }
    class Tiny extends Big{
        public void eat(){
        System.out.println( "很小的" );
        }
    }

      

      多态发生的前提:有继承关系的两个类中(或说体系)

    多态有两种类型:1、向上转型,这是从数据类型角度,把子类对象当成父类来处理,可看作自动类型转换

              2、向下转型,强制类型转换
       自动类型转换:1、基本数据类型中,低精度向高精度
              2、引用数据类型中,子类向父类
     强制类型转换:1、基本数据类型中,高精度向低精度
            2、引用数据类型中,子类向父类

    public class Poly02{
        public static void main(String[] args){
            //---------向上转型----------
            Big a1 = new Small();
            a1.eat();//输出子类
            //a1.happy();//找不到符号
            //向上转型的缺点:对丢失子类对象中特有的属性
    
    
            //---------向下转型----------
            //向下转型是基于某个类的对象向上转型后,才可向下转型
            Small a2 = (Small) a1;
            a2.happy();//输出子类
            a2.cry();//调用父类
            a2.eat();//输出子类
    
    
            //---------instanceof--------
            //运算符:判断当前对象是不是某个类实例化而来的
            Big a3 = new Tiny();
            a3.eat();
            //Small b2 = (Small) a3;
            //b2.happy();//编译通过,但是java.lang.ClassCastException错误
            if (a3 instanceof Small){
                Small b2 = (Small)a3;
            }
            System.out.println(a3 instanceof Small );
            //为了避免java.lang.ClassCastException错误,java引入了instanceof运算符
            //instanceof运算符,其运算结果是boolean;
            // if( 引用 instanceof 类型名)-->true/false
        }
    }

    以上就是我的理解.欢迎大家指导!

    ····················································Wing--九尾狗编辑 http://www.cnblogs.com/wing411/
  • 相关阅读:
    websocket的理解及实例应用
    laravel框架cookie应用到中间件的理解
    PHP多机实现session共享
    mysql中exists的详细说明
    window环境下安装pear
    php 进程管理及操作
    PHP设计模式之职责链模式
    PHP设计模式之备忘录模式
    PHP设计模式之装饰模式
    PHP设计模式之策略模式
  • 原文地址:https://www.cnblogs.com/wing411/p/4735131.html
Copyright © 2011-2022 走看看