java的多态认识

来源:互联网 发布:spyder安装python包 编辑:程序博客网 时间:2024/06/06 06:48

        Java中重要的一个概念就是多态,多态也是面向对象的核心之一。

         多态(Polymorphism)是面向对象(Object-Oriented,OO)思想"三大特征"之一,其余两个分别是封装(Encapsulation)和继承(Inheritance)--可见多态的重要性。或者说,不懂得什么是多态就不能说懂得面向对象。

         什么是多态那??刚开始了解的很少,看完了视频,通过例子和网上的查询对多态了解稍微深入了点。多态:父类引用指向子类对象,即是某个父类可以有很多不同子类,但这些子类重写了父类中的方法(即覆盖,不同子类有不同的实现方法),当在使用父类对象的的地方使用了子类对象,从而调用了不同实现方法,达到不同效果。一个对象可以实现很多对象的功能,即是多态。多态,意味着一个对象有着多重特征,可以在特定的情况下,表现不同的状态

        多态的优点:使用多态可以解决项目中紧偶合的问题,提高程序的课扩展性.是OCP原则(开放封闭原则)的一个具体的实现。多态是指程序中同名的不同方法共存的情况。多态是面向对象程序设计的又一个特性。我们知道,面向过程的程序设计中,过程或函数各具有一定的功能它们之间是不允许重名的;而面向对象程序设计中,则要利用这种多态来提高程序的抽象性,突出Java语言的继承性。面向对象的程序中多态的情况有多种,可以通过子类对父类方法的覆盖实现多态,也可以利用重载在同一个类中定义多个同名的不同方法。    多态的特点大大提高了程序的抽象程度和简洁性,更重要的是它最大限度地降低了类和程序模块之间的耦合性,提高了类模块的封闭性,使得它们不需了解对方的具体细节,就可以很好地共同工作。这个优点,对程序的设计、开发和维护都有很大的好处。

       Java中的object是所有类的基类,所有的类都继承object,比如在Object类中的equals(Objectobj)方法中,参数是个Object类型的参数.因为Object是Java中所有类的基类.,但是才传入参数的时候,可以传入任何一个类的对象

        这就是多态的应用!实现多态是在编译期间实现的,这样认识的重要性在于:我们可以只针对基类写出一段程序,但它可以适应于这个类的家族,因为编译器会自动就找出合适的对象来执行操作。这种现象又称为多态性。而实现多态性的手段又叫称动态绑定(dynamic binding)。

         动态绑定是指在“执行期间”,而非编译期间,判断所引用对象的实际类型,根据其实际的类型调用其相应的方法。动态绑定则针对运行期产生的访问请求,只用到运行期的可用信息. 在面向对象的代码中,动态绑定意味着决定哪个方法被调用或哪个属性被访问,将基于这个类本身而不基于访问范围.

 class Animal {  private String name;  Animal(String name) {this.name = name;}    public void enjoy(){    System.out.println("叫声......");  }} class Cat extends Animal {  private String eyesColor;  Cat(String n,String c) {super(n); eyesColor = c;}  public void enjoy() {    System.out.println("猫叫声......");  }}class Dog extends Animal {  private String furColor;  Dog(String n,String c) {   super(n);    furColor = c; }  public void enjoy() {    System.out.println("狗叫声......");  }}class Lady {    private String name;    private Animal pet;    Lady(String name,Animal pet) {   //宠物是animal类型,因为不知道宠物是什么?狗或猫?这里扩展性很好        this.name = name; this.pet = pet;    }    public void myPetEnjoy(){      pet.enjoy();   }}public class Test {    public static void main(String args[]){        Animal c =new Cat();             //多态父类引用指向子类对象        Animal d =new Dog();             //多态父类引用指向子类对象        Lady   l =new Lady("c1",c);                a.enjoy();  //猫叫声        d.enjoy();  //狗叫声    }}

        每个Java程序的引用变量(你这个里面引用变量就是c),都有编译类型和运行类型。编译就是将 .java文件编译成 .class文件,而运行就是 .class文件在操作系统上运行。 

        那么,这个时候,就出现多态了,一个类,他在编译时期和运行时期相同的动作却出现了不同的结果。Animal c= new Cat(); 如你的这个,a在编译的时候,只能调用Animal里面的方法和属性,而不能调用Cat的方法和属性。要注意的是,这样写Animal c= new Cat(); 后面的Cat必须继承Animal类,为了出现多态,Cat类中必须重写Animal的方法。所谓重写,就是要有和父类Animal中有一模一样的方法。

        编译的时候,c调用的是自己的方法,我们可以预测结果,但是运行的时候,却出现了不同的结果,因为他这个时候调用的是Cat的方法,这就是多态。多态呢,面向对象吗,动物是总类,他又自己特定方法,继承与他的其他动物也有这个特定方法,但是他们方法结果不一样的。多态,也仅仅是指类的方法,与属性没有任何关系。Animal c = new Cat(); a这个父类引用变量指向了Cat这个子类对象,这就是多态。

       以上程序的多态的优点还体现在可扩展性好,Lady类中我们传给Lady的是Animal类型,不知道宠物是dog还是cat?所以用Animal声明,最后传进去真正的对象之后,通过编译的时候,确定是cat还是dog,就可以了。

      继续对多态的了解,只有在实践中才能真正了解多态的实际真谛,加油



原创粉丝点击