zoukankan      html  css  js  c++  java
  • 面向对象的简单理解三

    对象的多态性:

    • 方法的重载,根据方法传入参数的不同,而调用的不同
    • 对象的多态性
    • 建议永远不要继承一个普通类。
    • 对象多态性是对继承的扩展,所以程序必须先有继承关系才能使用多态性
    • 如果一个方法被覆写了,则子类与父类之间发生转换时,调用的是子类中覆写的方法。
    Code
    class A
    {
        
    public void fun1()
        {
            System.out.println(
    "1、A --> public void fun1()") ;
        }
        
    public void fun2()
        {
            
    this.fun1() ;
        }
    };
    class B extends A
    {
        
    // 覆写了fun1()方法
        public void fun1()
        {
            System.out.println(
    "2、B --> public void fun1()") ;
        }
        
    // 增加了一个fun3()方法
        public void fun3()
        {
            System.out.println(
    "3、B --> public void fun3()") ;
        }
    };
    public class OODemo01
    {
        
    public static void main(String args[])
        {
           

       //
      a是A型的,子类对象为父类实例化,向上转型,子类对象向父类对象转型
       A a = null ;
            a = new B() ;
          

            
    // fun1方法被子类覆写了

            
           B  b = null ;
            
            b = (B)a ;(向下转型,父类为子类实例化)
            a.fun2() ;
       //输出的是B的fun1方法
           
    a.fun3() ;//已经转型的a类对象已经不能访问fun3方法了,主要是a是又A定义的是属于A类的
            
    // b.fun2() ;
        }
    };
    • 子类对象向父类对象的转换(向上)

          父类对象=子类对象(自动)如:A a=null;a=new B();

    • 父类对象向子类转换(向下)

          子类对象=(子类)父类对象(强制) 

    Code
    public class OODemo02
    {
        
    public static void main(String args[])
        {
            A a 
    = new A() ;
            a.fun2() ;
            B b 
    = (B)a ;
      //此会产生类转换异常
    ClassCastException,上面的不会发生是
      //因为 A a = null ;
            //a = new B() ;子类先为父类实例化,子类extends父类当然知道父类是谁了,这样A知道有B这个子类了,才能  进行向下转型
           //
    但在A a = new A() ;
            //a.fun2() ;
           // B b 
    = (B)a ;
    之中父类并不知道和子类的关系
        }
    };
    •  两个常见错误:ClassCastException(两个对象之间没有任何关系而进行的转换),NullPointException
    • 对象多态性的用处
    Code
    class A
    {
        
    public void fun1()
        {
            System.out.println(
    "1、A --> public void fun1()") ;
        }
        
    public void fun2()
        {
            
    this.fun1() ;
        }
    };
    class B extends A
    {
        
    // 覆写了fun1()方法
        public void fun1()
        {
            System.out.println(
    "2、B --> public void fun1()") ;
        }
        
    // 增加了一个fun3()方法
        public void fun3()
        {
            System.out.println(
    "3、B --> public void fun3()") ;
        }
    };
    class C extends A
    {
        
    // 覆写了fun1()方法
        public void fun1()
        {
            System.out.println(
    "4、C --> public void fun1()") ;
        }
        
    // 增加了一个fun3()方法
        public void fun4()
        {
            System.out.println(
    "5、C --> public void fun4()") ;
        }
    };
    public class OODemo03
    {
        
    public static void main(String args[])
        {
            
    // 对象都态性到底该怎么用?
            
    // 一个print方法,此方法可以接收A和B类的对象,并调用方法打印
            
    // 如果是A类对象,则调用fun2()方法
            
    // 如果是B类对象,则调用fun2()和fun3()两个方法
            print(new C()) ;
            
    // 如果A类还有20个子类,会怎么样?
            
    // 则此方法还要再写20遍
        }
        
    public static void print(A a)                      
     //对此程序的理解传的是new C(),传给 A a 即相当于 A a=new C(),这样就是向上转型了,A知道了和子类的关系,因//为用new实例化了再判断是谁的实例,再进行向下转型,这样就可调用各自的方法了。
        {
            a.fun2() ;
            
    // 缺少一个对象是否是某一个类的实例的判断       
            if(a instanceof B)
            {  
                B b 
    = (B)a ;
                b.fun3() ;
            }
            
    if(a instanceof C)
            {
                C c 
    = (C)a ;
                c.fun4() ;
            }
        }
       

    };
    • instanceof是关键字不是方法,注意返回的是Boolean值
    • 注意:对象多态性最核心的部分是方法的覆写和继承的关系,只要有覆写过的方法,则子类向父类转型时调用被覆写过的方法
  • 相关阅读:
    UI界面思想
    ARM汇编语言(3)(寄存器读写控制外设)
    ARM汇编(2)(指令)
    ARM汇编语言(1)(基本概念)
    QT软件初次使用中遇到的若干问题及思考
    webpack4打包html中img后src为“[object Module]”问题(已解决)
    gulp dev报错:ReferenceError:primordials is not defined(已解决)
    Ubuntu20.04安装yarn报错gpg: can't connect to the agent: IPC connect call failed(已解决)
    手摸手教程之ubuntu20.04更改国内镜像源(附其他版本ubuntu换源教程,最新详细教程)
    Alert提示框的vue组件编写
  • 原文地址:https://www.cnblogs.com/zhxiaomiao/p/1410957.html
Copyright © 2011-2022 走看看