【Java】多态

简介: 【Java】多态

简介:多态


1.多态

1.简介

在继承/实现的基础上的一种多种表现,可以是对象多态、行为多态。

package d1;
public class Test {
    public static void main(String[] args) {
        People p1 = new Student();//对象多态
        p1.run();//行为多态
    }
}
package d1;
public class Student extends People{
    public void run()
    {
        System.out.println("Student run!");
    }
}
package d1;
public class People {
    public void run()
    {
        System.out.println("People run!");
    }
}

前提:

  • 继承/实现关系
  • 父类引用子类对象,即People p1 = new Teacher();
  • 存在方法重写

注意:多态是针对于方法来说的,并不针对于变量

package d1;
public class Test {
    public static void main(String[] args) {
        People p1 = new Student();//对象多态
        p1.run();//行为多态
        System.out.println(p1.name);
    }
}

输出结果

2.多态的好处

  • 可以实现解耦合,右边对象随时更换,方便代码维护。
  • 可以使用父类类型的变量作为形参,便于接受一切子类对象。

3.多态的缺点及解决

缺点:多态下不能直接调用子类的独有功能。

为了解决上面说的多态缺点,提供下面方法。

方法解决:需要调用子类单独的方法时候,进行强制类型转换

可以通过instanceof来进行判断强转哪个类型:

package d2;
public class Test {
    public static void main(String[] args) {
        People p1 = new Student();//好处1:右边的类型可以随时更换
        p1.run();//行为多态
        System.out.println(p1.name);
        //好处2:可以使用父类作为形参,进而接受所有子类的形参
        People p2 = new Teacher();
        go(p1);
        go(p2);
        //正常的强制类型转换
        //(Student)p1.study();
        Student s1 = (Student)p1;
        s1.study();
        //崩溃
        //People p = new Teacher();
        //Student s = (Student)p;// 实际上p是老师类,转换为学生类与原类型不符,报错
    }
    public static void go(People p)
    {
        System.out.println("p.name(这个地方提供函数即可)" + "go");
    }
}

instanceof的使用:

package d2;
public class Test {
    public static void main(String[] args) {
        People p1 = new Student();//好处1:右边的类型可以随时更换
        if(p1 instanceof Student)
        {
            Student s2 = (Student)p1;
            s2.study();
        }
        else
        {
            Student t2 = (Student)p1;
            t2.study();
        }
    }
    public static void go(People p)
    {
        System.out.println("p.name(这个地方提供函数即可)" + "go");
    }
}

输出结果

2.final关键字

final + 变量

常量

3.抽象类(特殊的父类)

3.1简单介绍

3.2意义

抽象类的引入是为了更好的去支持多态这一语法。

我们常用来给父类设置为抽象类,然后用子类去重写父类的方法,这样可以支持子类的不同行为。多态的原则是编译看左边,运行看右边,而抽象类的引入是为了让编译过掉,而不至于报错,当然抽象类仅仅是解决这一问题的一种方案。

实例:

3.3模板方法设计模式

作用:用来大量解决方法代码重复问题。

举例:写一篇作文《我的爸爸》,首尾相同,正文不同。

注:模板方法+final修饰,可以防止该方法被重写从而导致模板失效问题。

4.接口

4.1概述

Java提供了一个特殊关键字:interface,用来定义接口。

接口的声明

语法格式:

注:接口不能实例化创建对象,接口是用来被实现类实现的。

接口的实现:

接口不能创建对象;接口是用来被类实现的,实现接口的类被称为实现类。

不同于类的继承,一个类可以实现多个接口,必须重写所有接口的全部抽象方法,或者实现类定义为抽象类也可以。

4.2接口意义(重点)

  • 弥补了类单继承的不足,一个类可以同时实现多个接口。

  • 让程序员面向接口编程,让程序员更加灵活的切换各种业务实现。

4.3接口的实例

学生类

学生管理类

学生操作接口

学生操作1类

学生操作2类

4.4JDK8之后,接口语法新增

简单介绍

使用

默认方法可以在Test中通过类对象的方式调用,也可以在实现类中使用。

私有方法只能在A中的默认方法和A中的其他私有方法中使用。

类方法可以在Test和子类和自己中都可以使用,不过得用类名的方式进行调用。

意义

增强了接口的权限,便于对大量的接口实现类进行维护。

4.5接口的注意事项

  • 一个接口继承多个接口,如果多个接口中存在方法签名冲突,则此时不支持多继承
  • 一个类实现多个接口,如果多个接口中存在方法签名冲突,则此时不支持多实现
  • 一个类继承父类且又同时实现了接口,父类和接口中有同名的默认方法,实现类会优先使用父类的
  • 一个类实现了多个接口,多个接口中存在同名的默认方法,可以不冲突,这个类重写该方法即可


EOF


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