【Java面向对象】多态的详细介绍,简单易懂,看这一篇就够了

简介: 【Java面向对象】多态的详细介绍,简单易懂,看这一篇就够了

什么是多态


A: 方法或对象具有多种形态,是面向对象的第三大特征,多态是建立在封装和继承的基础之上的。简单来说,多态是具有表现多种形态的能力的特征。


多态的优点


消除类型之间的耦合关系

可替代性

可扩充性

接口性

灵活性

简化性


多态的分类


重载式多态


重载式多态在编译时已经确定好了。方法名相同而参数列表不同的一组方法就是重载。在调用这种重载的方法时,通过传入不同的参数最后得到不同的结果。


案例


public void add(int a, int b) {
    int c = a + b;
    System.out.println("两个整数相加得 " + c);
}
public void add(float a, float b) {
    float c = a + b;
    System.out.println("两个float型浮点数相加得" + c);
}


重写式多态


重写式多态是指在执行期间判断所引用对象的实际类型,根据其实际的类型调用其相应的方法。也就是说,只有程序运行起来,你才知道调用的是哪个子类的方法。 这种多态通过函数的重写以及向上转型来实现,我们接下来讲的所有多态都是重写式多态,因为它才是面向对象编程中真正的多态。


多态的向上转型


Q:什么是多态的向上转型?

A:父类的引用指向子类的对象叫做向上转型。


Q:向上转型的怎么写?

A:父类类型 引用名 = new 子类类型();


Q:向上转型有什么特点?

A:编译类型看左边,运行类型看右边。可以调用父类中的所有成员。最终运行效果看子类的具体实现。


案例


//动物类,拥有一个call()方法
class Animal {
    public void call() {
        System.out.println("动物叫!");
    }
}
 // 狗类,实现父类动物,并重写call()方法
class Dog extends Animal {
    public void call() {
        System.out.println("汪汪!");
    }
    public void color() {
        System.out.println("狗狗颜色!");
    }
}
 // 猫类,实现父类动物,并重写call()方法
class Cat extends Animal {
    public void call() {
        System.out.println("喵~");
    }
    public void color() {
        System.out.println("猫猫颜色!");
    }
}
 //测试类
public class Test {
    public static void main(String[] args) {
      //向上转型
        Animal animal = new Dog();
        animal.call();
        animal = new Cat();
        animal.call();
    }
}


这里 Animal animal = new Dog();将子类对象Dog转化为父类对象Animal,这个时候Animal引用指向的是子类对象,所以调用的方法是子类方法。

向上转型时,子类单独定义的方法会丢失。比如,上面案例中的Dog类和Cat类都定义了自己的call方法,当进行了向上转型后,Animal引用指向Dog类的实例时是访问不到color方法的,Animal.color()会报错。


多态的向下转型


Q:什么是多态的向下转型?

A:子类引用指向父类对象(父类型,实例是子类的实例化)叫做多态的向下转型。通常需要进行强制类型转换。


案例


//动物类,拥有一个call()方法
class Animal {
    public void call() {
        System.out.println("动物叫!");
    }
}
 // 狗类,实现父类动物,并重写call()方法
class Dog extends Animal {
    public void call() {
        System.out.println("汪汪!");
    }
    public void color() {
        System.out.println("狗狗颜色!");
    }
}
 // 猫类,实现父类动物,并重写call()方法
class Cat extends Animal {
    public void call() {
        System.out.println("喵~");
    }
    public void color() {
        System.out.println("猫猫颜色!");
    }
}
 //测试类
public class Test {
    public static void main(String[] args) {
      //向上转型
      Animal animal = new Dog();
      //向下转型
        Dog dog = (Dog)animal;//向下转型,强制类型转换
        dog.color();//输出狗狗颜色!
        Cat cat = (Cat)animal;//报错
        Animal animal = new Animal();
        Dog dog = (Dog)animal;//报错
    }
}


这里需要注意Dog dog = (Dog)Animal;可以正常运行,是因为dog本身就是Dog对象,可以正常转型为Dog,而不能转型为Cat。aniaml类是Animal对象,他也不能向下转型成任何子类对象。


总结一下:

1)向下转型的前提是父类引用指向的是子类对象,也就是说,向下转型之前,它得先进行过向上转型。

2)向下转型只能转型为本类对象。


相关文章
|
2月前
|
算法 Java 程序员
在Java的编程世界里,多态不仅仅是一种代码层面的技术,它是思想的碰撞,是程序员对现实世界复杂性的抽象映射,是对软件设计哲学的深刻领悟。
在Java的编程世界里,多态不仅仅是一种代码层面的技术,它是思想的碰撞,是程序员对现实世界复杂性的抽象映射,是对软件设计哲学的深刻领悟。
57 9
|
2月前
|
Java 开发者
在Java面向对象编程的广阔海洋中,多态犹如一股深邃的潜流,它推动着代码从单一走向多元,从僵化迈向灵活。
在Java面向对象编程的广阔海洋中,多态犹如一股深邃的潜流,它推动着代码从单一走向多元,从僵化迈向灵活。
35 7
|
2月前
|
Java 开发者
那些年,我们一同踏入Java编程的大门,多态,这个充满魔法的名字,曾无数次点亮我们探索面向对象编程的热情。
那些年,我们一同踏入Java编程的大门,多态,这个充满魔法的名字,曾无数次点亮我们探索面向对象编程的热情。
41 5
|
2月前
|
Java 程序员
让我们一起探讨Java多态的奥秘,看看它是如何打破“一刀切”的局限,让我们的代码更加生动多彩
让我们一起探讨Java多态的奥秘,看看它是如何打破“一刀切”的局限,让我们的代码更加生动多彩
34 5
|
5天前
|
Java 编译器
封装,继承,多态【Java面向对象知识回顾①】
本文回顾了Java面向对象编程的三大特性:封装、继承和多态。封装通过将数据和方法结合在类中并隐藏实现细节来保护对象状态,继承允许新类扩展现有类的功能,而多态则允许对象在不同情况下表现出不同的行为,这些特性共同提高了代码的复用性、扩展性和灵活性。
封装,继承,多态【Java面向对象知识回顾①】
|
19天前
|
Java 编译器
Java——类与对象(继承和多态)
本文介绍了面向对象编程中的继承概念,包括如何避免重复代码、构造方法的调用规则、成员变量的访问以及权限修饰符的使用。文中详细解释了继承与组合的区别,并探讨了多态的概念,包括向上转型、向下转型和方法的重写。此外,还讨论了静态绑定和动态绑定的区别,以及多态带来的优势和弊端。
22 9
Java——类与对象(继承和多态)
|
3天前
|
Java
java中面向过程和面向对象区别?
java中面向过程和面向对象区别?
13 4
|
5天前
|
Java
接口和抽象类【Java面向对象知识回顾②】
本文讨论了Java中抽象类和接口的概念与区别。抽象类是不能被实例化的类,可以包含抽象和非抽象方法,常用作其他类的基类。接口是一种纯抽象类型,只包含抽象方法和常量,不能被实例化,且实现接口的类必须实现接口中定义的所有方法。文章还比较了抽象类和接口在实现方式、方法类型、成员变量、构造方法和访问修饰符等方面的不同,并探讨了它们的使用场景。
接口和抽象类【Java面向对象知识回顾②】
|
8天前
|
Java
Java 多态趣解
在一个阳光明媚的午后,森林中的动物们举办了一场别开生面的音乐会。它们组成了一支乐队,每种动物都有独特的演奏方式。通过多态的魅力,狗、猫和青蛙分别展示了“汪汪”、“喵喵”和“呱呱”的叫声,赢得了观众的阵阵掌声。熊指挥着整个演出,每次调用 `perform()` 方法都能根据不同的动物对象唤起对应的 `makeSound()` 方法,展现了 Java 多态性的强大功能,让整场音乐会既有趣又充满表现力。
|
20天前
|
安全 Java Go
面向对象程序设计语言:Java
Java语言语法和C语言和C++语言很接近,很容易学习和使用,Java丢弃了C++中很少使用的、很难理解的、令人迷惑的特性,Java语言不使用指针,而是引用,并提供了自动分配和回收内存空间,使得程序员不必为内存管理而担忧
34 2
下一篇
无影云桌面