Java_45_面向对象_多态_基本概念_强制转型问题_instanceof运算符

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/pmcasp/article/details/82019568

面向对象的三大特征:继承、封装、多态

多态(polymorphism)

多态性是OOP中的一个重要特性,主要是用来实现动态联编的,换句话说,就是程序的最终状态只有在执行过程中才被决定而非在编译期间就决定了。这对于大型系统来说能提高系统的灵活性和扩展性。

多态可以让我们不用关心某个对象到底是什么具体类型,就可以使用该对象的某些方法,从而实现更加灵活的编程,提高系统的可扩展性。

为什么需要多态?

多态性是指允许不同类的对象对同一消息做出不同的响应。

Java中如何实现多态?使用多态的好处?

引用变量的两种类型:

编译时类型【模糊一点,一般是一个父类】

由声明时的类型决定。

运行时类型【运行时,具体是哪个子类就是那个子类】

由实际对应的对象类型决定。通过动态绑定调用该对象的方法。动态绑定会使我们的程序编写更加灵活,但是会减慢程序运行速度。

这也是Java比C++满的主要原因之一。

多态:如果编译时类型和运行时类型不一致,就会造成多态。

方法绑定(method binding)

执行调用方法时,系统根据相关信息,能够执行内存地址中代表该方法的代码。分为静态绑定和动态绑定。

静态绑定:在编译期完成,可以提高代码执行速度。

动态绑定:通过对象调用的方法,采用动态绑定机制。这虽然让我们编程灵活,但是降低了代码的执行速度。这也是Java比C、C++速度慢的主要因素之一。Java中除了final类、final方法、static方法,所有方法都是JVM在运行期才进行动态绑定的。

应该针对成员变量、static方法等做一个专门的动态绑定的课程:

http://blog.sina.com.cn/s/blog_600046120100wdza.html

http://blog.csdn.net/aaaaaaaa0705/article/details/6263213

http://www.doc88.com/p-389664843916.html

多态的使用要点

1.多态是方法的多态,属性没有多态性。

2.编写程序时,如果想调用运行时类型的方法,只能进行类型转换。不然通不过编译器的检查。但是如果两个没有关良的类进行强制转换,会报:ClassCastException。比如:本来是狗,我把它转成猫。就会报这个异常。

3.多态的存在要有三个必要条件:要有继承、要有方法重写、父类引用指向子类对象。

对象的转型(casting)

为什么需要强制转换类型?

引用变量只能调用它编译类型的方法,不能调用它运行类型的方法。这时,我们就需要进行类型的强制转换!

1.一个父类的引用类型变量可以“指向”其子类的对象。

2.一个父类的引用不可以访问其子类对象新增加的成员(属性和方法)。

3.可以使用引用变量instanceof类名来判断该引用型变量所“指向”的对象是否属于该类或该类的子类

public static void testVoice(Animal a) {
        a.voice();
        if(a instanceof Pig) {
            ((Pig)a).s1();
        }
    }

4.子类的对象可以当做基类的对象来使用称作向上转型(upcasting),反之称为向下转型(downcasting)

 

className name=(className)name 强制转型后可以调用子类特有的方法和属性

猜你喜欢

转载自blog.csdn.net/pmcasp/article/details/82019568