zoukankan      html  css  js  c++  java
  • 对多态的理解,示例

    多态指的是一个对象体现出多种不同的形态,可以将同一种行为表现出不同的效果。

    多态的表现形式:

    1.多态的前提需要有继承关系

    2.使用父类的引用指向子类对象-向上转型

    3.父类引用只能调用父类中的属性跟方法

    4.如果调用属性,执行父类的,如果调用方法,看子类是否重写该方法。

    5.若想调用子类独有的成员,将身份还原回去(造型-向下转型)

    若需要转换的类型与真实对象类型不匹配,会产生一个运行时异常ClassCastException

    6.为了避免转型时产生问题,可以利用instanceof进行判断前面的对象与后面的类是否匹配

    package bank;
    
    public abstract class Person {
            protected String name;
            public Person(){}
            public Person(String name){
                this.name=name;
            }
            public abstract String getName();
            //1.进银行,排好
            public abstract void CallNumber();
            //2.办理
            public abstract void handle();
            //3.离开
            public abstract void leave();
    }
    package bank;
    
    public class Bank {
        public void business(Person p){
            p.CallNumber();
            p.handle();
            p.leave();
        }
    }
    package bank;
    
    public class OldMan extends Person{
        public String getName(){
            return this.name;
        }
        public OldMan(){
            
        }
        public OldMan(String name){
            this.name=name;
        }
        
        //1.进银行,排号
        public void CallNumber(){
            System.out.println("老年人进门取号");
        }
        //2.办理
        public void handle(){
            System.out.println("杵着拐走到窗口坐下,开始办理业务");
        }
        //3.离开
        public void leave(){
            System.out.println("收好钱,慢慢离开银行");
        }
    
    }
    package bank;
    
    public class YoungMan extends OldMan{
        public String str="nbClass";
        public YoungMan(){
            
        }
        public YoungMan(String name){
            this.name=name;
        }
        public String getName(){
            return this.name;
        }
        //1.进银行 叫号
        public void CallNumber(){
            System.out.println("手机叫号");
        }
        //2.办理
        public void handle(){
            System.out.println("自助终端办理");
        }
        //离开
        public void leave(){
            System.out.println("跑着离开了");
        }
    }
    package bank;
    
    public class RichMan extends Person{
        public RichMan(){
            
        }
        public RichMan(String name){
            this.name=name;
            
        }
        @Override
        public String getName() {
            // TODO Auto-generated method stub
            return this.name;
        }
            //1.进银行 叫号
            public void CallNumber(){
                System.out.println("进门,客户经理迎接");
            }
            //2.办理
            public void handle(){
                System.out.println("业务经理帮忙办理");
            }
            //离开
            public void leave(){
                System.out.println("行长送我离开");
            }
            
    }
    package polymorphic;
    
    import bank.Bank;
    import bank.OldMan;
    import bank.Person;
    import bank.RichMan;
    import bank.YoungMan;
    
    //多态设计,父类的引用指向子类对象,具体需要哪个子类自己决定,然后调用方法时,首先看是否在Person中有定义,如果有定义则再看是否在子类重写过,重写过就调用子类重写后的方法。
    //没有重写就调用父类的(如果父类这个方法没有实现当然就不调咯),属性的话,只看Person也就是抽象父类,父类的引用调不到子类的属性,除非向下转型
    public class TestPolymorphic {
        public static void main(String[] args){
            Bank bank=new Bank();
    //        Person p=new RichMan();
    //        Person p=new OldMan();
            Person p=new YoungMan("王二麻子");
    //        System.out.println(p.getName());
    //        YoungMan ym=(YoungMan)p;
    //        System.out.println(ym.str);
            bank.business(p);
        
        }
    }
  • 相关阅读:
    二叉查找树(二)
    白话红黑树系列之一——初识红黑树
    二叉查找树(三)
    白话红黑树系列之二——红黑树的构建
    二叉查找树(一)
    二叉查找树(五)
    选择实现—简单工厂
    嵌入式开发er的C语言能力自测(面试)题top 16
    AOP探索笔记
    浅谈.net插件式编程
  • 原文地址:https://www.cnblogs.com/hebiao/p/12875139.html
Copyright © 2011-2022 走看看