9、多态剖析

来源:互联网 发布:js的find方法 编辑:程序博客网 时间:2024/06/06 15:01

1、当两个方法形成重写关系时,可以在子类方法中通过super.run()形式调用父类的run()方法,其中super.run()不必放在第一行语句,因此此时父类对象已经构造完毕,先调用父类的run()方法还是先调用子类run()方法是根据程序的逻辑决定的。(子类调用父类中的方法,可以使用super.方法名(参数)的格式。)

2、在定义一个类时,如果没有显示指定该类的父类,那么该类就会继承于java.lang.object类(jdk提供的一个类,object类是java中所有类的直接或者间接父类)。object类是最顶层的类,根类。

3、多态(polymorphism):我们说子类就是父类(玫瑰是花,男人是人),因此多态的意思就是:父类型的引用可以指向子类型的对象。

4、父类型的引用可以指向子类型的对象。

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

如:parent p = new Child();  当使用多态方式调用方法时,首先检查父类中是否有sing()方法,如果没有则编译错误;如果有,再去调用子类的sing()方法。

编译的出错信息:

6、关于强制类型转换, 一共有两种类型的强制类型转换:

A)  向上类型转换(upcast):比如说将Cat类型转换为animal类型,即将子类型转换为父类型。对于向上类型转换,不需要显式指定。

B)  向下类型转换(downcast):比如将animal类型转换为cat类型。即将父类型转换为子类型,对于向下类型转换,必须要显式指定(必须要使用强制类型转换)。不是什么父类型都可以向下转换的,要看这个父类型变量具体指向的是什么对象。

为什么要使用向下类型转换?为了使用子类中特有的方法和属性,按照继承,父类中有的子类中一定有,子类中可以增加新的和修改原有的,而如果使用父类型指向一个子类型对象,就不能使用子类中的新增方法等。

public class PolyTest3
{
    publicstaticvoid main(String[] args)
    {
        /*
        Animal animal = new Cat();
        Animal animal2 = new Animal();
          
        animal2 =animal;
        //animal和animal2都是Animal类型变量,同种变量类型可以相互赋值
        //animal2由原来的指向Animal对象改为指向Cat对象
        animal2.run();
        //打印结果为cat is run
        */
        /*
        Animal animal = new Cat();
        Animal animal2 = new Animal();
  
        animal =animal2;
        //animal和animal2都是Animal类型变量,同种变量类型可以相互赋值
        //animal由原来的指向Cat对象改为指向Animal对象
        animal.run();
        //打印结果为animal is run
        */
  
        Cat cat = new Cat();
        Animal animal = cat;
        //animal和cat是不同类型的类型变量,将Cat类型变量赋值给Animal类型变量
        //animal指向Cat对象,父类型变量指向子类型对象
        animal.run();
        //打印结果为子类型方法结果:cat is run
          
        /*
        Animal animal = new Animal();
        Cat cat = (Cat)animal;
        //编译通过,运行错误,
        */
  
        //向上类型转换
        Cat cat =newCat();
  
        Animal animal = (Animal)cat;
        //这里(Animal)cat是向上类型转换,可以不显示转换直接写cat
  
        animal.run();
          
  
        //向下类型转换
        Animal a =newCat();
        //Cat cat =a;这样写不行,这样写就是说父类就是子类
        Cat c =(Cat)a;
        c.run();
    }
}
  
class Animal
{
    publicvoidrun()
    {
        System.out.println("animal is run");
    }
}
class dog extends Animal
{
    publicvoidrun()
    {
        System.out.println("dog is run");
    }
}
class Cat extends Animal
{
    publicvoidrun()
    {
          
        System.out.println("cat is run");
    }
}

在参数传递中使用的非常多,如定义一个方法

public void run(Animal animal)

{

}

传递参数时

Cat cat = new Cat();

.run(cat);

 

原创粉丝点击