方法的多态,对象的多态,向上转型,向下转型知识点

public class test {
  /*  (1)方法的多态体现在重写和重载。
    重写 即为在子类中把父类本身有的方法重新写一遍,覆盖掉;重载是同名函数具有不同的参数需求、返回类型。
    重写发生在父子类之间,重载发生在本类
*/

    /* (2)对象的多态体现在
       1、编译类型(左) 和 运行类型(右) 可以不同
       2、编译类型在定义对象时确定,不可变
       3、运行类型可以变
        典例如下:
        Animal animal = new dog();
        animal = new cat();
     */
    public static void main(String[] args) {
    animal Animal = new dog();
    Animal.cry();//执行该行时animal的运行类型是dog。

        //重新分配运行类型。编译类型还是animal
        //重新分配对象有点像指针。对象是引用类型,在创建时,new xxx会在堆中开辟一块空间。
        //左边的编译类型Elem xxx可以类比一个指针 指向了右边在堆中的对象。因此也可以把这个指针重新赋值为另一个对象
    Animal = new cat();
    Animal.cry();

    Animal.feed(Animal);//多态

    }
}

class animal{
    public void cry(){
        System.out.println("animal crying");
    }

    public void feed(animal animal)
    {
        animal.cry();
//多态的体现。参数列表为animal,当传入对象的编译类型为animal时,dog、cat都可以 形参只关注编译类型
    }

}

class cat extends animal{
    @Override
    public void cry(){
        System.out.println("cat cry");
    }
}
class dog extends animal{
    @Override
    public void cry(){
        System.out.println("dog cry");
    }
}

public class detail {
    /*多态的向上转型:父类引用指向子类对象
    * 注意!可以访问父类中的属性,但不能访问子类中的特有属性(重写的方法可以,特有的不行)。Object这种间接父类也可以!
    * 在编译阶段,能调用哪些成员是由编译类型来决定的
    * 最终运行效果看子类的具体实现。因为调用方法时,会从运行类型开始查找方法,一级一级向上查找调用。
    * */
    /*
    /*多态的向下转型
    *语法:子类类型 引用名 = (子类)父类引用
     要求:这个父类引用指向的必须是这个子类类型
     向下转型以后完全变成该子类
     */
    /*
    ****动态绑定****:  调用方法时,该方法会和对象的运行类型绑定在一起,优先从子类开始查找方法。
    **                 调用属性时,哪里声明哪里使用,没有动态绑定。你用的父类的方法,那就在父类找参数。用的子类方法就用子类参数。

     */

    public static void main(String[] args){
        animal2 animal = new cat2();
        animal.say();
       // animal.hi()此处会报错,是特有方法。方法调用是看编译阶段的

        cat2 cat = (cat2)animal;
        cat.hi();

    }


}

 class animal2{
    String name;
    void say(){
        System.out.println("sdfsdf");
    }
}

class cat2 extends animal2{
    void hi(){
        System.out.println("ok");
    }
}

你可能感兴趣的:(java,开发语言)