Java学习---day08_多态和抽象类

本文详细探讨了Java中的多态概念,包括多态实现原理、优点、对象转型以及多态中的方法重写。同时,深入讲解了抽象类的定义、抽象方法的特点、抽象类的继承和使用场景,强调了抽象类在约束子类行为中的规则制定作用。
摘要由CSDN通过智能技术生成

Java学习—day08_多态和抽象类

多态

主观意识上的类别, 与客观存在的事物, 存在 is a 的关系的时候, 即形成了多态。

在程序中, 一个类的引用指向另外一个类的对象, 从而产生多种形态。 当二者存在直接或者
间接的继承关系时, 父类引用指向子类的对象, 即形成多态。

继承是多态的前提,如果类与类之间没有继承关系,也不会存在多态.

多态实现原理
  • 多态:在代码中的描述是用父类的引用指向子类的对象
父子关系:Student  extends  Person      Person extends  Object
//直接父类的引用指向子类对象---多态
Person person = new Student();
//Object不是Student的直接父类,但是是间接父类,这里也是多态
Object o = new Student()
  • java程序运行分成两个阶段:编译,运行

编译阶段:从打开程序到执行运行之前—只能识别=前面的引用类型,不会识别=后面的对象
运行阶段:从运行开始—识别=后面对象,对象开始干活儿

例如:Person person = new Student();
编译阶段识别: person  是Person类的引用
运行阶段识别:new出来的Student对象
  • 动态机制:(了解)

类型:动态类型,动态绑定,动态加载
动态加载:我们在编译阶段不能确定具体的对象类型,只有到了运行阶段才能确定真正的干活儿
的对象.
多态就是典型的动态加载

  • 在多态下只能直接调用父类有的方法,不能直接调用子类特有的方法?-----√

例如:下面代码中person不能直接调用run方法
工作机制:1.首先通过Person保存的地址找到Student对象 2.Student对象再去调用run方法.
原因:在编译的时候识别的是引用类型,不识别对象.所以只能识别出Person里面的方法,而不能
直接调用子类特有的方法.

public class Demo4 {
   
    public static void main(String[] args) {
   
        //继承--使用的一定是子类
        Student student = new Student();
        student.show();
 
        //多态:在代码中的描述就是用父类的引用指向子类的对象
        Person person = new Student();
 
       //可以调用,在show方法在父类Person里面
        person.show();
 
        //这里运行会报错,原因:在Person类里面找不到run方法
        //person.run();
    }
}
class  Person{
   
    String name;
    public  void  show(){
   
        System.out.println("show");
    }
}
class  Student extends  Person{
   
    int age;
    public  void  run(){
   
        System.out.println("run");
    }
}
多态的优点【会】

可以提高代码的扩展性,使用之前定义好的功能,后面直接拿来使用,不用再创建新的方法.

public class Demo5 {
   
    public static void main(String[] args) {
   
      //创建狗,猫,动物对象
        Dog dog = new Dog();
        Cat cat = new Cat();
        Animal animal = new Animal();
     
        feedAnimal(animal);
//      feedDog(dog);
//      feedCat(cat);
        feedAnimal(dog);
        feedAnimal(cat);
    }
 
    //喂狗,喂猫,喂动物
    public static void feedAnimal(Animal animal) {
   //animal = dog = new Dog()   多态
        animal.eat();
    }
//  public static  void  feedDog(Do
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值