Java中的多态与动态绑定

本文通过具体示例讲解了Java中的多态性及其与动态绑定的关系,演示了如何使用父类引用调用子类方法,并解释了强制类型转换的作用。

       关于Java的多态在慕课网上的教程中已经学到了,但是当时似乎没有看到有动态绑定这么个主题。虽说,动态绑定的相关功能再教程中确实是提到了。

       而Java中的多态一般是跟动态绑定放到一块儿说的,我个人的理解是这更加有助于理解Java类继承的相关技术。通过这种方法,可以更好地把多态与重载两个概念给区分开。接下来写一段代码总结一下:

packagepkgWulin;

 

class JiangHuRen

{

    String Name;

    int age;

    String MenPai;

   

    void KongFu()

    {

        System.out.println("江湖人会功夫");

    }

}

 

class ShaoLinDiZi extends JiangHuRen

 

{

    void KongFu()

    {

        System.out.println("会少林功夫");

    }

}

 

class WuDangDiZi extends JiangHuRen

{

    void KongFu()

    {

        System.out.println("会武当功夫");

    }

}

 

class EMeiDiZi extends JiangHuRen

{

    void KongFu()

    {

        System.out.println("会峨眉功夫");

    }

}

 

public class JiangHu {

 

    public static void main(String[] args) {

        // TODO Auto-generated method stub

        JiangHuRen[] jiang_hu_ren_shi = new JiangHuRen[3];

       

        jiang_hu_ren_shi[0] = new ShaoLinDiZi();

        jiang_hu_ren_shi[1] = new WuDangDiZi();

        jiang_hu_ren_shi[2] = new EMeiDiZi();

 

        jiang_hu_ren_shi[0].KongFu(); 

        jiang_hu_ren_shi[1].KongFu(); 

        jiang_hu_ren_shi[2].KongFu(); 

    }

 

}

       代码编译运行结果:

会少林功夫

会武当功夫

会峨眉功夫

    通过上面的运行结果可以得出结论:

    1,通过父类声明的对象课可以存储根据子类创建的对象;

    2,1中的对象拥有父类中覆写的方法(其他方法暂时看不出来)。

    修改代码如下:

packagepkgWulin;

 

class JiangHuRen

{

    String Name;

    int age;

    String MenPai;

   

    void KongFu()

    {

        System.out.println("江湖人会功夫");

    }

}

 

class ShaoLinDiZi extends JiangHuRen

 

{

    void KongFu()

    {

        System.out.println("会少林功夫");

    }

   

    void YiJinJing()

    {

        System.out.println("会用易筋经");

    }

}

 

class WuDangDiZi extends JiangHuRen

{

    void KongFu()

    {

        System.out.println("会武当功夫");

    }

}

 

class EMeiDiZi extends JiangHuRen

{

    void KongFu()

    {

        System.out.println("会峨眉功夫");

    }

}

 

public class JiangHu {

 

    public static void main(String[] args) {

        // TODO Auto-generated method stub

        JiangHuRen[] jiang_hu_ren_shi = new JiangHuRen[3];

       

        jiang_hu_ren_shi[0] = new ShaoLinDiZi();

        jiang_hu_ren_shi[1] = new WuDangDiZi();

        jiang_hu_ren_shi[2] = new EMeiDiZi();

 

        jiang_hu_ren_shi[0].KongFu(); 

        jiang_hu_ren_shi[1].KongFu(); 

        jiang_hu_ren_shi[2].KongFu();

       

        jiang_hu_ren_shi[0].YiJinJing(); 

    }

 

}

       这段代码在eclipse中会提示有错误,无法进行到编译以及运行的阶段。由此可以看出,利用父类声明的元素虽然可以用于存储子类,但是却无法访问子类的方法。我之前的博客中对此进行过模型化的理解思维,类就像是一个标签,在父类的标签上并没有写出子类的索引,因此无法找到相应的属性或者方法。而使用强制数据类型转换的意义在在于——根据箱子里面的内容增加标签上的标记。如此,修改代码如下:

packagepkgWulin;

 

class JiangHuRen

{

    String Name;

    int age;

    String MenPai;

   

    void KongFu()

    {

        System.out.println("江湖人会功夫");

    }

}

 

class ShaoLinDiZi extends JiangHuRen

 

{

    void KongFu()

    {

        System.out.println("会少林功夫");

    }

   

    void YiJinJing()

    {

        System.out.println("会用易筋经");

    }

}

 

class WuDangDiZi extends JiangHuRen

{

    void KongFu()

    {

        System.out.println("会武当功夫");

    }

}

 

class EMeiDiZi extends JiangHuRen

{

    void KongFu()

    {

        System.out.println("会峨眉功夫");

    }

}

 

public class JiangHu {

 

    public static void main(String[] args) {

        // TODO Auto-generated method stub

        JiangHuRen[] jiang_hu_ren_shi = new JiangHuRen[3];

       

        jiang_hu_ren_shi[0] = new ShaoLinDiZi();

        jiang_hu_ren_shi[1] = new WuDangDiZi();

        jiang_hu_ren_shi[2] = new EMeiDiZi();

 

        jiang_hu_ren_shi[0].KongFu(); 

        jiang_hu_ren_shi[1].KongFu(); 

        jiang_hu_ren_shi[2].KongFu();

       

        ((ShaoLinDiZi)jiang_hu_ren_shi[0]).YiJinJing();  

    }

 

}

       代码编译运行结果如下:

会少林功夫

会武当功夫

会峨眉功夫

会用易筋经

       进一步总结知识点:

       1,父类声明而根据子类创建的对象访问子类中专有属性或者方法时需要强制数据类型转换;

       2,强制数据类型转换的时候,访问属性或者方法需要加括号以示其为一个对象整体。


上面提到的理解模型需要参考我之前的博客:http://blog.youkuaiyun.com/grey_csdn/article/details/56558021

Java 中,有两种类型的多态:静态多态(也称为编译时多态或早期绑定)动态多态(运行时多态或晚期绑定)。 **静态多态(编译时多态)**: 静态多态主要是通过函数重载(Overload)来实现的,即在一个类中创建两个或更多的同名方法,它们的参数列表不同(包括参数类型、数量或顺序)。在编译阶段,Java 编译器会根据方法的调用信息(传入的实际参数类型)选择最匹配的方法进行编译,这在代码执行前就已经确定。例如: ```java public class Example { public void print(int num) { System.out.println("Integer value: " + num); } public void print(String str) { System.out.println("String value: " + str); } } Example obj = new Example(); obj.print(5); // 静态多态调用的是 int 的 print() 方法 ``` **动态多态(运行时多态或晚期绑定)**: 动态多态是通过方法重写(Override)继承机制来实现的。如果一个子类覆盖了父类的方法,那么当父类引用指向子类对象时,调用该方法将执行子类版本。这是通过 Java 虚拟机 (JVM) 在运行时确定调用的具体方法。示例如下: ```java class Parent { public void show() { System.out.println("Parent method"); } } class Child extends Parent { @Override public void show() { System.out.println("Child method"); } } Parent parent = new Child(); // 创建 Child 对象,但引用为 Parent 类型 parent.show(); // 动态多态调用的是 Child 类的 show() 方法 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值