分享

java多态、动态绑定与静态绑定、向上转型、传值引用和传引引用

 Mis林桑 2017-03-15

      分类: Java

java多态是其语言一大特性,对多态最直接的理解可以是认为同一方法在不同条件下使用会有不同的效果。就像在不同状态下对同一操作进行触发操作得到的结果不同。举个例子:在计算机里面不同的菜单下同样按下按键K获取的结果不一样。还是先来看几个代码深入理解一下:

student st=new student(); st.print(2); st.print(2,3); st.print(2,3,5); st.print(1.1); st.print(1.1,2.2); st.print(1.1,2.2,3.3);

            创建学生对象st,对象可以调用同一方法名,但是参数类型和参数个数可以不同,前面说过可以认为这是方法重载。这也是多态的一种,是属于一种静态绑定。重载与覆盖多属于多态中的一种情况。

关于静态绑定

            在程序执行前方法已经被绑定,此时由编译器或其它连接程序实现。

      针对java简单的可以理解为程序编译期的绑定;

关于动态绑定

            动态绑定是指在执行期间(非编译期)判断所引用对象的实际类型,根据其实际的类型调用其相应的方法。程序运行过程中,把函数(或过程)调用与响应调用所需要的代码相结合的过程称为动态绑定。动态绑定是一种后期绑定:在运行时根据具体对象的类型进行绑定。提起这个还需要提一下向上转型:

关于向上转型

            向上转型多与覆盖技术相结合。例如:father s= new son();son类就是继承father类得到的,那么这时候可以这么理解:对象s是son类的实例对象,但是又属于父类,然后把它强制转型为father类对象。所以father类方法被子类son类中的方法覆盖。来看下面这个实例:

class A{ publicvoidA1(){ System.out.println('父类方法1'); } publicvoidA2(){ System.out.println('父类方法2'); } } class B extends A{ publicvoidA1() { System.out.println('子类方法1'); } publicvoidB2() { System.out.println('子类方法2'); } } publicclassC{publicstaticvoidmain(String args[]){ A a=new B(); } }

            上面给出了A类与B类的继承关系,B类作为A类的子类除了扩展了自己的B2()方法还有父类A1方法。这样A a=new B(); 就产生了向上转型。对象a虽然是B的实例对象,但是却强制转换为A类对象。接下来可以做一下下面的三个测试:

a.A1(); a.A2(); a.B2();

      来看一下输出:

      子类方法1

      父类方法2

      输出a.B2()时会报错

            分析一下上面的结果,a.A1();语句执行后子类会对父类的A1()方法产生覆盖,因此执行的是子类的A1()方法。这一点理解很重要。执行a.A2();由于向上转型强制转换父类A对象后就可以调用父类A的A2方法。那么第三条执行语句会报错呢?a.B2();说明对象a无法调用子类对象B2()方法。这还是要回到向上转型上面来,因为对象a向上转型以后只能执行父类的方法,但是子类方法会对父类方法产生覆盖影响。这也就是动态绑定的过程。当然还有向下转型和动态绑定跟深入的理解,推荐阅读《java编程思想》。

关于java超类

            用java术语来讲,被继承的类称为超类(SuperClass),也有叫做父类,继承的类称为子类。java中的默认的超类是object类。

关于java传值引用和传引引用

             传值就是你改变这个值,不会改变原值。例如 int a=1;把a作为参数经过方法调用,在方法中改变a的值如。a=2;在方法中a是变成2了。但是在方法外面a还是1。如果是传引用,值是会变的。

      基本数据类型传递时值传递;对象传递都是引用传递;

      注意以下几点:

      1 .基本类型和String型作为参数时,为传值方式,只把值传入方法,不管在方法中怎么处理这个参数,原值不变。

      2 其他引用类型作为参数时,为传址方式,将指向内存中的地址传入方法,方法中此内存地址中的值发生变化时,原值也会改变。

      3 如果引用类型的对象通过传址方式将其指向内存中的地址传入方法后,方法中使用new关键字重新给参数赋值时,会在内存中重新开辟空间,参数指向新的内存空间,此时参数和原对象指向的就不是同一个地址了,参数值的变化不会改变原值;

      4 字符串在内存中是存储在堆中的一个常量,String对象指向内存中这个常量的地址,通过传址方式将地址传入方法后,方法中如果通过字符串给参数赋值,则会重新在堆中创建一个字符串常量,并指向这个地址,原值依然指向原来的字符串常量地址,参数值的变化不会改变原值。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多