Java(十九)多态

简介: Java(十九)多态

多态,面向对象的三大特征之一。


那么,什么是多态呢?


多态是指一个对象在不同的时刻,表现出来的不同的状态。

 

一:多态的基本使用


多态的前提条件:


1:要有继承关系


2:要有方法的重写


3:要有父类引用指向子类对象


上一段代码:


public class T02 {
    public static void main(String[] args) {
        // 父类引用指向子类对象
        fu fu = new zi();
        fu.print();// 子类
    }
}
/**
 * 父类
 */
class fu
{
    public void print()
    {
        System.out.println("父类");
    }
}
/**
 * 子类
 */
class zi extends fu
{// 有继承关系
    @Override // 有方法重写
    public void print()
    {
        System.out.println("子类");
    }
}


输出:


子类


二:多态间子父类之间成员变量的关系


public class T02 {
    public static void main(String[] args) {
        // 父类引用指向子类对象
        fu fu = new zi();
        // fu.print();// 子类
        System.out.println(fu.i); // 输出 1
        // =================================================
        // 这行代码编译报错
        // System.out.println(fu.j);
    }
}
/**
 * 父类
 */
class fu
{
    public int i = 1;
    public void print()
    {
        System.out.println("父类");
    }
}
/**
 * 子类
 */
class zi extends fu
{// 有继承关系
    public int j = 2;
    public int i = 4;
    @Override // 有方法重写
    public void print()
    {
        System.out.println("子类");
    }
}

输出:

1

 

通过上边的运行结果分析,父类引用不能使用子类中特有的成员变量


父类和子类中相同名字的成员变量调用的是父类的成员变量。


总结一句口诀:

多态调用成员变量的时候,编译看左边,运行看左边。

 

三:多态间子父类之间成员方法的关系


父类中有一个成员方法,子类中有一个与父类同名的成员方法,以及一个独有的成员方法。


如下方代码所示:


public class T02 {
    public static void main(String[] args) {
        // 父类引用指向子类对象
        fu fu = new zi();
        fu.print();// 子类
        // ==============================================
        // 这行代码编译报错
        // fu.printSP();
    }
}
/**
 * 父类
 */
class fu
{
    public int i = 1;
    public void print()
    {
        System.out.println("父类");
    }
}
/**
 * 子类
 */
class zi extends fu
{// 有继承关系
    public int j = 2;
    public int i = 4;
    @Override // 有方法重写
    public void print()
    {
        System.out.println("子类");
    }
    public void printSP()
    {
        System.out.println("子类独有的方法");
    }
}

输出:

子类

 

通过结果分析,父类引用可以使用子类中重写父类的方法。

总结一句口诀:

多态调用成员方法,编译看左边,运行看右边

 

四:多态间子父类之间静态成员方法的关系


public class T02 {
    public static void main(String[] args) {
        // 父类引用指向子类对象
        fu fu = new zi();
        fu.print();// 父类
    }
}
/**
 * 父类
 */
class fu
{
    public int i = 1;
    public static void print()
    {
        System.out.println("父类");
    }
}
/**
 * 子类
 */
class zi extends fu
{// 有继承关系
    public int j = 2;
    public int i = 4;
    public static void print()
    {
        System.out.println("子类");
    }
}

输出:

父类

 

总结一句口诀:


多态,静态,成员变量和成员方法,编译看左边,运行看左边。


其实,静态方法这个已经脱离了类的多态的范畴了。只要类加载,他就存储在内存中了。

 

五:多态的弊端


父类引用不能使用子类中特有的内容。


但是呢,这个好像是不太行啊,我们怎么处理这个问题呢?


我们可以通过向下转型来解决这个问题。

1:向上转换:

Fu fu = new zi();

 

2:向上转换:

Zi zi = (Zi)fu;


注意:向下转型转不好容易出现异常:ClassCastException类型转换异常,是在运行的时候报错。


下边使用代码举一个报错的例子:


package d0419;
public class T02 {
    public static void main(String[] args) {
        // 父类引用指向子类对象
        person fu = new teacher();
        fu.print();// 教师类
        // ========================================
        // 这行代码报错
        // fu.printSP();
        // ========================================
        // 正确的向下转换
        teacher tea = (teacher)fu;
        tea.printSP();
        // ========================================
        // 错误的向下转换
        student stu = (student)fu;
        stu.printSP();
    }
}
/**
 * 父类
 */
class person
{
    public void print()
    {
        System.out.println("父类");
    }
}
/**
 * 教师类
 */
class teacher extends person
{// 有继承关系
    public void print()
    {
        System.out.println("教师类");
    }
    public void printSP()
    {
        System.out.println("教师类特有方法");
    }
}
/**
 * 学生类
 */
class student extends person
{// 有继承关系
    public void print()
    {
        System.out.println("学生类");
    }
    public void printSP()
    {
        System.out.println("学生类特有方法");
    }
}

输出:

教师类
教师类特有方法
Exception in thread "main" java.lang.ClassCastException: d0419.teacher cannot be cast to d0419.student
        at d0419.T02.main(T02.java:19)

 

以上大概就是 java多态的基本使用。

 

有好的建议,请在下方输入你的评论。


目录
相关文章
|
2月前
|
算法 Java 程序员
在Java的编程世界里,多态不仅仅是一种代码层面的技术,它是思想的碰撞,是程序员对现实世界复杂性的抽象映射,是对软件设计哲学的深刻领悟。
在Java的编程世界里,多态不仅仅是一种代码层面的技术,它是思想的碰撞,是程序员对现实世界复杂性的抽象映射,是对软件设计哲学的深刻领悟。
57 9
|
2月前
|
Java 开发者
在Java面向对象编程的广阔海洋中,多态犹如一股深邃的潜流,它推动着代码从单一走向多元,从僵化迈向灵活。
在Java面向对象编程的广阔海洋中,多态犹如一股深邃的潜流,它推动着代码从单一走向多元,从僵化迈向灵活。
35 7
|
2月前
|
Java 开发者
那些年,我们一同踏入Java编程的大门,多态,这个充满魔法的名字,曾无数次点亮我们探索面向对象编程的热情。
那些年,我们一同踏入Java编程的大门,多态,这个充满魔法的名字,曾无数次点亮我们探索面向对象编程的热情。
41 5
|
2月前
|
Java 程序员
让我们一起探讨Java多态的奥秘,看看它是如何打破“一刀切”的局限,让我们的代码更加生动多彩
让我们一起探讨Java多态的奥秘,看看它是如何打破“一刀切”的局限,让我们的代码更加生动多彩
34 5
|
2月前
|
Java 程序员
Java中的继承和多态:理解面向对象编程的核心概念
【8月更文挑战第22天】在Java的世界中,继承和多态不仅仅是编程技巧,它们是构建可维护、可扩展软件架构的基石。通过本文,我们将深入探讨这两个概念,并揭示它们如何共同作用于面向对象编程(OOP)的实践之中。你将了解继承如何简化代码重用,以及多态如何为程序提供灵活性和扩展性。让我们启程,探索Java语言中这些强大特性的秘密。
|
5天前
|
Java 编译器
封装,继承,多态【Java面向对象知识回顾①】
本文回顾了Java面向对象编程的三大特性:封装、继承和多态。封装通过将数据和方法结合在类中并隐藏实现细节来保护对象状态,继承允许新类扩展现有类的功能,而多态则允许对象在不同情况下表现出不同的行为,这些特性共同提高了代码的复用性、扩展性和灵活性。
封装,继承,多态【Java面向对象知识回顾①】
|
20天前
|
Java 编译器
Java——类与对象(继承和多态)
本文介绍了面向对象编程中的继承概念,包括如何避免重复代码、构造方法的调用规则、成员变量的访问以及权限修饰符的使用。文中详细解释了继承与组合的区别,并探讨了多态的概念,包括向上转型、向下转型和方法的重写。此外,还讨论了静态绑定和动态绑定的区别,以及多态带来的优势和弊端。
22 9
Java——类与对象(继承和多态)
|
8天前
|
Java
Java 多态趣解
在一个阳光明媚的午后,森林中的动物们举办了一场别开生面的音乐会。它们组成了一支乐队,每种动物都有独特的演奏方式。通过多态的魅力,狗、猫和青蛙分别展示了“汪汪”、“喵喵”和“呱呱”的叫声,赢得了观众的阵阵掌声。熊指挥着整个演出,每次调用 `perform()` 方法都能根据不同的动物对象唤起对应的 `makeSound()` 方法,展现了 Java 多态性的强大功能,让整场音乐会既有趣又充满表现力。
|
2月前
|
Java 开发者
【Java基础面试十五】、 说一说你对多态的理解
这篇文章解释了多态性的概念:在Java中,子类对象可以赋给父类引用变量,运行时表现出子类的行为特征,从而允许同一个类型的变量在调用同一方法时展现出不同的行为,增强了程序的可扩展性和代码的简洁性。
【Java基础面试十五】、 说一说你对多态的理解
|
2月前
|
安全 Java 编译器
Java多态
Java多态
16 2
下一篇
无影云桌面