JAVA-多态

文章目录

1.多态的概念

2.多态的实现条件

3.重写

总结


一 . 多态的概念

什么是多态?  通俗来说,就是多种形态,具体点就是去完成某个行为,当不同的对象去完成时会产生出不同的状态


定义一个基类Animal和两个派生类cat,dog,派生类重写基类中的eat()方法

定义Test测试类,用来测试方法method执行的结果。

public class Test {
    public static void main(String[] args) {
        Dog dog = new Dog();
        Cat cat = new Cat();
        method(dog);
        method(cat);
    }
    public static void method(Animal animal){
        // 子类的对象由父类接受,称之为向上转型,反之,则为向下转型
        animal.eat();
    }
}

class Dog extends Animal{
    @Override
    public void eat() {
        System.out.println("狗吃饭");
    }
}

class Cat extends Animal{
    @Override
    public void eat() {
        System.out.println("猫吃饭");
    }
}
class Animal{
    String name;
    int age;
    public void eat(){
        System.out.println("动物吃饭");
    }
}

代码执行结果

一个函数中,传入不同的对象,输出结果却不同,猫和狗在吃饭上有不同的表现形式,但却都是继承了

 Animal类,一个对象在不同条件下所表现出的不同形式,这便是多态! 


2.多态的实现条件

  • 必须在继承条件下
  • 子类必须对父类中要实现多态的方法进行重写
  • 通过父类的引用调用重写的方法(实现多态的方法中的参数是父类)

3.重写

重写(override):也称为覆盖。重写是子类对父类非静态、非private修饰,非final修饰,非构造方法等的实现过程 进行重新编写, 返回值和形参都不能改变。即外壳不变,核心重写!重写的好处在于子类可以根据需要,定义特定于自己的行为。 也就是说子类能够根据需要实现父类的方法。

规则:

1.子类在重写父类的方法时,一般必须与父类方法原型一致: 返回值类型 方法名 (参数列表) 要完全一致

2.被重写的方法返回值类型可以不同,但是必须是具有父子关系的

3.访问权限不能比父类中被重写的方法的访问权限更低。例如:如果父类方法被public修饰,则子类中重写该方 法就不能声明为 protected

4.父类被static、private修饰的方法、构造方法都不能被重写。

5.重写的方法, 可以使用 @Override 注解来显式指定. 有了这个注解能帮我们进行一些合法性校验. 例如不小心 将方法名字拼写错了 (比如写成 aet), 那么此时编译器就会发现父类中没有 aet 方法, 就会编译报错, 提示无法 构成重写.

重写和重载的区别:

静态绑定:也称为前期绑定(早绑定),即在编译时,根据用户所传递实参类型就确定了具体调用那个方法。典型代表函数重载。

public class Test {
    public static void main(String[] args) {
        Animal animal = new Dog();
        System.out.println(animal.name);
        //调用成员变量:编译看左边,运行也看左边
        //编译看左边:javac编译代码的时候,会看左边的父类中有没有这个变量,如果有,编译成功,如果没有编译失败。
        //运行也看左边:java运行代码的时候,实际获取的就是左边父类中成员变量的值
    }
}

class Dog extends Animal{
    String name = "狗";
    int age = 2;

    @Override
    public void eat() {
        System.out.println("狗吃饭");
    }
}

class Cat extends Animal{
    String name = "猫";
    int age = 2;
    
    @Override
    public void eat() {
        System.out.println("猫吃饭");
    }
}
class Animal{
    String name = "动物";
    int age = 2;

    public void eat(){
        System.out.println("动物吃饭");
    }
}

成员变量便是属于静态绑定 

动态绑定:也称为后期绑定(晚绑定),即在编译时,不能确定方法的行为,需要等到程序运行时,才能够确定具体 调用那个类的方法。

public class Test {
    public static void main(String[] args) {
        Animal animal = new Dog();
        animal.eat();
        //调用成员方法:编译看左边,运行看右边
        //编译看左边:javac编译代码的时候,会看左边的父类中有没有这个方法,如果有,编译成功,如果没有编译失败。
        //运行看右边:java运行代码的时候,实际上运行的是子类中的方法
    }
}

class Dog extends Animal{
    String name = "狗";
    int age = 2;

    @Override
    public void eat() {
        System.out.println("狗吃饭");
    }
}

class Cat extends Animal{
    String name = "猫";
    int age = 2;

    @Override
    public void eat() {
        System.out.println("猫吃饭");
    }
}
class Animal{
    String name = "动物";
    int age = 2;

    public void eat(){
        System.out.println("动物吃饭");
    }
}

成员方法属于动态绑定


总结

以上便是多多态的相关内容了,望大家多多支持!

  • 25
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 29
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 29
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

喜欢吃animal milk

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

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

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

打赏作者

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

抵扣说明:

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

余额充值