zoukankan      html  css  js  c++  java
  • 多态

    Java学习之 多态 Polymorphism

     

    Java学习之多态

                                           --------转--------

    多态的概念

      多态==晚绑定

      不要把函数重载理解为多态。

      因为多态是一种运行期的行为,不是编译期的行为。

      多态:父类型的引用可以指向子类型的对象。

      比如 Parent p = new Child();

        当使用多态方式调用方法时,首先检查父类中是否有该方法,如果没有,则编译错误;

        如果有,再去调用子类的该同名方法。

      (注意此处,静态static方法属于特殊情况,静态方法只能继承,不能重写Override,如果子类中定义了同名同形式的静态方法,它对父类方法只起到隐藏的作用。调用的时候用谁的引用,则调用谁的版本。)

        

      如果想要调用子类中有而父类中没有的方法,需要进行强制类型转换,如上面的例子中,将p转换为子类Child类型的引用。

      因为当用父类的引用指向子类的对象,用父类引用调用方法时,找不到父类中不存在的方法。这时候需要进行向下的类型转换,将父类引用转换为子类引用。    

    结合实例说明               

      下面举个例子(有问题的代码已注释):

      主要讲讲两种类型转换和两种编译时候的错误。  

    public class PolyTest
    {
        public static void main(String[] args)
        {
            
            //向上类型转换
            Cat cat = new Cat();
            Animal animal = cat;
            animal.sing();
    
                    
            //向下类型转换
            Animal a = new Cat();
            Cat c = (Cat)a;
            c.sing();
            c.eat();
    
    
            //编译错误
            //用父类引用调用父类不存在的方法
            //Animal a1 = new Cat();
            //a1.eat();
            
            //编译错误
            //向下类型转换时只能转向指向的对象类型        
            //Animal a2 = new Cat();
            //Cat c2 = (Dog)a2;
            
    
    
        }
    }
    class Animal
    {
        public void sing()
        {
            System.out.println("Animal is singing!");
        }
    }
    class Dog extends Animal
    {
        public void sing()
        {
            System.out.println("Dog is singing!");
        }
    }
    class Cat extends Animal
    {
        public void sing()
        {
            System.out.println("Cat is singing!");
        }
        public void eat()
        {
            System.out.println("Cat is eating!");
        }
    } 
    

      

    public class PolyTest
    {
        public static void main(String[] args)
        {
            
            //向上类型转换
            Cat cat = new Cat();
            Animal animal = cat;
            animal.sing();
    
                    
            //向下类型转换
            Animal a = new Cat();
            Cat c = (Cat)a;
            c.sing();
            c.eat();
    
    
            //编译错误
            //用父类引用调用父类不存在的方法
            //Animal a1 = new Cat();
            //a1.eat();
            
            //编译错误
            //向下类型转换时只能转向指向的对象类型        
            //Animal a2 = new Cat();
            //Cat c2 = (Dog)a2;
            
    
    
        }
    }
    class Animal
    {
        public void sing()
        {
            System.out.println("Animal is singing!");
        }
    }
    class Dog extends Animal
    {
        public void sing()
        {
            System.out.println("Dog is singing!");
        }
    }
    class Cat extends Animal
    {
        public void sing()
        {
            System.out.println("Cat is singing!");
        }
        public void eat()
        {
            System.out.println("Cat is eating!");
        }
    }

      

      例子的执行结果:

      

      这段代码:  

      Cat类中定义了eat()方法,但是Animal类中没有这个方法,a1引用是Animal类的,所以找不到,编译时出错:

      

     

    两种类型的类型转换

      (1)向上类型转换(Upcast):将子类型转换为父类型。

      对于向上的类型转换,不需要显示指定,即不需要加上前面的小括号和父类类型名。

      

      (2)向下类型转换(Downcast):将父类型转换为子类型。

      对于向下的类型转换,必须要显式指定,即必须要使用强制类型转换。

      

      并且父类型的引用必须指向子类的对象,即指向谁才能转换成谁。

      不然也会编译出错:

      因为父类引用指向的是Cat类的对象,而要强制转换成Dog类,这是不可能的。

  • 相关阅读:
    《JAVA程序设计》第10周学习总结
    《JAVA程序设计》第9周学习总结
    《Java程序设计》第8周学习总结
    《Java程序设计》第7周学习总结
    《Java程序设计》第6周学习总结
    《Java程序设计》第5周学习总结
    《Java程序设计》第4周学习总结
    《Java程序设计》第3周学习总结
    《Java程序设计》第2周学习总结
    201521123044 《Java程序设计》第12周学习总结
  • 原文地址:https://www.cnblogs.com/kai123-qwe/p/5964795.html
Copyright © 2011-2022 走看看