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多态的基本使用。

 

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


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