9、多态剖析

本文详细探讨了Java中多态的概念及其应用,包括如何通过子类调用父类方法,以及多态在实际编程中的优势。同时,阐述了向上类型转换和向下类型转换的原理和实例,帮助开发者更好地理解和运用Java的面向对象特性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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
{
    publicstatic void 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 =new Cat();
  
        Animal animal = (Animal)cat;
        //这里(Animal)cat是向上类型转换,可以不显示转换直接写cat
  
        animal.run();
          
  
        //向下类型转换
        Animal a =new Cat();
        //Cat cat =a;这样写不行,这样写就是说父类就是子类
        Cat c =(Cat)a;
        c.run();
    }
}
  
class Animal
{
    publicvoid run()
    {
        System.out.println("animal is run");
    }
}
class dog extends Animal
{
    publicvoid run()
    {
        System.out.println("dog is run");
    }
}
class Cat extends Animal
{
    publicvoid run()
    {
          
        System.out.println("cat is run");
    }
}

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

public void run(Animal animal)

{

}

传递参数时

Cat cat = new Cat();

.run(cat);

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

kaoa000

你的鼓励将是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值