对‘父类引用指向子类对象’这句话的理解

本文讲解了Java中的多态概念,通过cat和bird的move方法覆盖示例,展示了多态如何实现行为的不同表现形式。深入剖析了编译和运行阶段的静态与动态绑定,以及多态的三个关键条件:继承、方法覆盖和父类引用指向子类。还涉及了子类特有方法使用、父类方法的利用和向下转型限制等知识点。

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

1,第一要理解这句话要知道方法覆盖与方法重载,这个我在另外一篇博文中写了
2,第二是要理解什么是多态。多态(Polymorphism)属于面向对象三大特征之一,它的前提是封装形成独立体,独立体之间存在继承关系,从而产生多态机制。多态是同一个行为具有多个不同表现形式或形态的能力
举例1:注意以下代码放入不同类中,这个例子中,cat和bird都有move,就是将父类animal中的move覆盖了,这就是方法重写(方法覆盖),两者虽然都是move,但是表现结果不同,这就是多态。

public class Animal { 
     public void move() { 
     System.out.println("Animal move!"); 
     }
 }
public class Cat extends Animal{ 
   //方法覆盖 
   public void move(){ 
   System.out.println("走猫步!"); 
   } //子类特有 
   public void catchMouse(){ 
   System.out.println("抓老鼠!"); 
   } 
}
public class Bird extends Animal{ 
//方法覆盖 
    public void move(){ 
    System.out.println("鸟儿在飞翔!");
     } 
     //子类特有 
     public void sing(){ 
     System.out.println("鸟儿在歌唱!");
     }
}
public class Test01 {
 public static void main(String[] args) { 
 //创建Animal对象 
 Animal a = new Animal(); 
 a.move(); 
 //创建Cat对象 
 Cat c = new Cat(); c.move(); 
 //创建鸟儿对象 
 Bird b = new Bird(); 
 b.move(); 
 }

例二:注意,要导包。这个就是父类引用指向子类对象。

package testPoly2;

import testPoly.Animal;
import testPoly.Bird;
import testPoly.Cat

public class Test02 {
    public static void main(String[] args) {
        Animal a1 = new Cat();
        a1.move();
        Animal a2 = new Bird();
        a2.move();
    }
}

3,理解完多态,就开始讲题目那句话了。
Animal a1 = new Cat();
a1.move();
首先Java程序包括编译和运行两个阶段。在编译阶段,a1引用去父类Animal.class字节码中寻找对应的move()方法,找到之后进行绑定,称之为‘静态绑定’。在实际运行阶段,发现引用a1实际上指向Cat类,这时使用Cat中的方法,称之为动态绑定。但是,无论什么时候,都必须先静态绑定,然后动态绑定。
4,下面是几个延伸知识点
延伸一:使用子类中独有的。如果没有这一句向下转型,就会报错,因为父类引用不能直接调用子类中独有的方法

public class Test03 {
    public static void main(String[] args) {
        Animal a = new Cat();
        //注意,如果没有下面这一句向下转型,就会报错,因为父类引用不能直接调用子类中独有的方法
        Cat c=(Cat)a;
        c.catchMouse();
    }
}

延伸二:使用父类中独有的方法
父类引用可以使用父类中有而子类中没有的功能,如果讲父类中加上一个eat()功能,如果使用4中的a去调用,这时会输出父类中的方法。
延伸三:如果父类Animal引用指向子类对象Cat,此时向下强转为Bird,是否可以使用Bird中的方法?不可以

public class Test03 {
    public static void main(String[] args) {
        Animal a = new Cat();
        //注意,如果没有下面这一句向下转型,就会报错,因为父类引用不能直接调用子类中独有的方法
        //Bird c=(Bird)a;ClassCastException
        //c.sing();
        Cat c=(Cat) a;
        c.catchMouse();

    }
}

总结:多态的三个条件:继承,方法覆盖,父类引用指向子类对象。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值