Java-多态(上)

简介: Java-多态(上)

1.多态的概念



       多态字面意思就是多种形态,具体点就是完成某个行为时,不同的对象完成时产生不同的状态。


579a4256862542509a81c219b4573b47.png


        总之,同一件事情,发生在不同的对象身上,会有不同的结果。


2.多态的实现条件。



       在java中要实现多态,必须要满足如下几个条件,缺一不可:


             1. 继承关系上:向上转型

               2. 子类有和父类同名的重写方法

               3.  通过父类对象的引用,调用重写的方法


      完成以上三个条件,就会发生动态绑定,动态绑定是多态的基础。


       多态的体现:在代码运行时,传递不同类对象时,会调用对应类中的重写方法。


class Animals{
    public String name;
    public int age;
    public Animals(String name,int age){
        this.name=name;
        this.age=age;
 }
    public void eat(){
        System.out.println(this.name+"正在吃饭");
    }
}
class Dogs extends Animals{
    public Dogs(String name, int age){
        super(name,age);
    }
    public void bark(){
        System.out.println(this.name+"正在汪汪叫~");
    }
    //方法重写
    @Override  //注解
    public void eat() {
        System.out.println(this.name+"正在吃狗粮");
    }
}
class Cats extends Animals{
    public Cats(String name, int age){
        super(name,age);
    }
    public  void mimi(){
        System.out.println(this.name+"正在喵喵叫~");
    }
    //方法重写
    @Override  //注解
    public void eat() {
        System.out.println(this.name+"正在吃猫粮");
    }
}
public class Text {
        public static void main(String[] args) {
        //animal这个引用 指向了Dogs类的对象,向上转型直接赋值
        Animals animal=new Dogs("赛虎",10);
        animal.eat();//父类的eat
        System.out.println("====");
        //animal这个引用 指向了Cats类的对象,向上转型直接赋值
        Animals animal1=new Cats("菲菲",15);
        animal1.eat();
    }
}


e0a13c8882e14d359c76142a985cbdba.png


与上述代码中向上转型方式不同,但原理相同。


af3dff9cde724f818a79fa27c7f03c65.png


3.重写



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


public void eat(){
    System.out.println(this.name+"正在吃饭");
}
public void eat() {
    System.out.println(this.name+"正在吃狗粮");
}
public void eat() {
    System.out.println(this.name+"正在吃猫粮");
}

      095326bae4a84def9af52ef135c74c77.png


重写规则:


       1.一般最基本的:返回值、参数列表、方法名必须一样。


       2.被重写的方法的访问修饰限定符在子类中要大于等于在父类中的,即访问权限不能比父类中被重写的方法的访问权限更低,例如如果父类方法被public修饰,则子类中重写该方法就不能声明为 protected。


       3.父类被static、private,final修饰的方法、构造方法都不能被重写


       4.重写的方法, 可以使用 @Override 注解来显式指定. 有了这个注解能帮我们进行一些合法性校验。

2b12e5ae9d4c47a09bdc23fa57ad71be.png

        方法重载(overloading)是一个类的多态性表现,而方法重写(overriding)是子类与父类的一种多态性表现。


41376c603d544b80bb1d32d1f1f9fc06.png


        重写设计原则:对于已经投入使用的类,尽量不要进行修改。最好的方式是:重新定义一个新的类,来重复利用其中共性的内容,并且添加或者改动新的内容


       例如:几十年前的手机,只能打电话,发短信,来电显示只能显示号码,而今天的手机在来电显示的时候,不仅仅可以显示号码,还可以显示头像,地区等。在这个过程当中,我们不应该在原来老的类上进行修改,因为原来的类,可能还在有用户使用,正确做法是:新建一个新手机的类,对来电显示这个方法重写就好了,这样就达到了我们当今的需求了。

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

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

ac1a0a06157b49a799cd49336060fd21.png



目录
相关文章
|
3月前
|
算法 Java 程序员
在Java的编程世界里,多态不仅仅是一种代码层面的技术,它是思想的碰撞,是程序员对现实世界复杂性的抽象映射,是对软件设计哲学的深刻领悟。
在Java的编程世界里,多态不仅仅是一种代码层面的技术,它是思想的碰撞,是程序员对现实世界复杂性的抽象映射,是对软件设计哲学的深刻领悟。
64 9
|
3月前
|
Java 开发者
在Java面向对象编程的广阔海洋中,多态犹如一股深邃的潜流,它推动着代码从单一走向多元,从僵化迈向灵活。
在Java面向对象编程的广阔海洋中,多态犹如一股深邃的潜流,它推动着代码从单一走向多元,从僵化迈向灵活。
38 7
|
3月前
|
Java 开发者
那些年,我们一同踏入Java编程的大门,多态,这个充满魔法的名字,曾无数次点亮我们探索面向对象编程的热情。
那些年,我们一同踏入Java编程的大门,多态,这个充满魔法的名字,曾无数次点亮我们探索面向对象编程的热情。
46 5
|
3月前
|
Java 程序员
让我们一起探讨Java多态的奥秘,看看它是如何打破“一刀切”的局限,让我们的代码更加生动多彩
让我们一起探讨Java多态的奥秘,看看它是如何打破“一刀切”的局限,让我们的代码更加生动多彩
40 5
|
3月前
|
Java 程序员
Java中的继承和多态:理解面向对象编程的核心概念
【8月更文挑战第22天】在Java的世界中,继承和多态不仅仅是编程技巧,它们是构建可维护、可扩展软件架构的基石。通过本文,我们将深入探讨这两个概念,并揭示它们如何共同作用于面向对象编程(OOP)的实践之中。你将了解继承如何简化代码重用,以及多态如何为程序提供灵活性和扩展性。让我们启程,探索Java语言中这些强大特性的秘密。
|
18天前
|
存储 Java 测试技术
Java零基础-多态详解
【10月更文挑战第10天】Java零基础教学篇,手把手实践教学!
15 4
|
23天前
|
Java 编译器 程序员
Java多态背后的秘密:动态绑定如何工作?
本文介绍了Java中多态的实现原理,通过动态绑定和虚拟方法表,使得父类引用可以调用子类的方法,增强了代码的灵活性和可维护性。文中通过具体示例详细解析了多态的工作机制。
29 4
|
2月前
|
Java 编译器
封装,继承,多态【Java面向对象知识回顾①】
本文回顾了Java面向对象编程的三大特性:封装、继承和多态。封装通过将数据和方法结合在类中并隐藏实现细节来保护对象状态,继承允许新类扩展现有类的功能,而多态则允许对象在不同情况下表现出不同的行为,这些特性共同提高了代码的复用性、扩展性和灵活性。
封装,继承,多态【Java面向对象知识回顾①】
|
29天前
|
Java
java继承和多态详解
java继承和多态详解
38 5
|
27天前
|
存储 Java 测试技术
Java零基础-多态详解
【10月更文挑战第1天】Java零基础教学篇,手把手实践教学!
25 1