【JAVA学习之路 | 基础篇】面相对象特征--多态性

简介: 【JAVA学习之路 | 基础篇】面相对象特征--多态性

1.对象的多态性

  • 多态性,是面相对象中最重要的概念.在java中的体现 : 对象的多态性 : 父类的引用指向子类的对象.
  • 格式 : (父类类型 : 指子类继承父类的类型,或者实现的接口类型) 父类类型 变量名 =子类对象.
  • 例 : Object o = new Person(),Object类型的变量o指向子类Person类型的对象.
  • 在Java中,子类的对象可以替代父类的对象使用.所以,一个引用类型变量可能指向多个不同类型(子类类型)的变量

2.多态性的应用场景

  • (虚方法的调用)在Java中,虚方法是在编译阶段不能确定方法的调用入口地址,在运行阶段才能确定的方法,即可能被重写的方法.Person p =new Man(),p.XXX().屏蔽了子类特有的属性和方法.
  • 用父类做方法的形参,是多态使用最多的场合.即使增加了子类,方法也无需改变,提高了扩展性,符合开闭原则.
public class InsatnceText {
    public static void main(String[] args) {
        InsatnceText t = new InsatnceText();
        t.method(new Person());
        t.method(new Student());
        t.method(new Graduate());
    }
    public void method(Person e) {
        e.getInfo();
}
 
输出结果:
a person
a person
a student
a person
a student
a graduate
 
 
public class Person {
    public Person() {}
  
    public void getInfo() {
        System.out.println("a person");
    }
}
 
public class Graduate extends Person {
    public void getInfo() {
        System.out.println("a person");
        System.out.println("a student");
        System.out.println("a graduate");
    }
}
 
public class Student extends Person {
    public void getInfo() {
        System.out.println("a person");
        System.out.println("a student");
    }
}
  • 在多态的场景下,调用方法时,(1).编译时,认为方法是左边声明的父类的类型的方法(即被重写的方法).(2).运行时,实际执行的是子类重写父类的方法.
  • 即编译看左边,运行看右边.

3.使用前提和适用性

(1).使用前提 : 要有类的继承关系 ; 要有方法的重写.

(2).适用性 : 适用于方法,不适用于属性.

4.多态的好处和弊端

(1).好处 : 极大的减少的代码的冗余,不需要定义多个重载的方法.如方法形参里带父类的类型变量,实参传子类的对象.


(2).弊端 : 在多态的场景下,我们创建了子类的对象,也加载了子类特有的属性和方法,但由于声明为父类的引用,导致我们没有办法直接调用子类特有的属性和方法.(但可以通过向下转型)

5.向上转型

(1). class Animal{

    public int i =1;

    public void eat() {

         System.out.println("Animal is.eating");

    }

}

class Person extends Animal{

    public int i =2;

    @Override

    public void eat() {

        System.out.println("Person is eating");

    }

    public void sleep() {

    System.out.println("Person is sleeping");

    }

}

class Cat extends Animal{

    public int i =3;

    @Override

    public void eat() {

        System.out.println("Cat is eating");

    }

}
  • Aminal a =new Person();    //父类的引用指向子类的对象.
  • p只能调用父类声明的方法,而该方法通常被子类重写,故运行时实际上调用的是子类重写的方法.
  • 由于编译类型为Animal,不能调用子类特有的方法,因为父类中并没有声明该方法,如果a.sleep(),编译器会报错.
  • 通过new创造对象时父类的属性和方法,子类的属性和方法均被加载到内存中,如果将输出a.i的值,将输出1.同时体现了,方法才有多态性,而属性没有.

6.向下转型

  • 如果我们确实需要调用子类特有的方法及属性,可以通过强制类型转换.
  • 如果将输出p.i的值,将输出2.

Person p =(Person) a;    //向下转型

此时编译类型为Person,可以调用子类特有的方法.p.sleep()  //true

7.instanceof关键字

(1). (对象A) instanceof (类名B)


(2). A是否是B的实例,如果是,则返回true;否则,IDEA将产生异常.(if A为null,不会产生异常,只是返回false)


(3). 举例


Animal a =new Animal();


Person p =new Person();


Cat c =new Cat();


  • a instanceof Object   //true
  • p instanceof Animal   //true  人是动物
  • c instanceof Animal   //true  cat是动物
  • c instanceof Person   //异常   cat不是人
相关文章
|
25天前
|
XML Java 编译器
Java学习十六—掌握注解:让编程更简单
Java 注解(Annotation)是一种特殊的语法结构,可以在代码中嵌入元数据。它们不直接影响代码的运行,但可以通过工具和框架提供额外的信息,帮助在编译、部署或运行时进行处理。
86 43
Java学习十六—掌握注解:让编程更简单
|
17天前
|
安全 Java 编译器
Java对象一定分配在堆上吗?
本文探讨了Java对象的内存分配问题,重点介绍了JVM的逃逸分析技术及其优化策略。逃逸分析能判断对象是否会在作用域外被访问,从而决定对象是否需要分配到堆上。文章详细讲解了栈上分配、标量替换和同步消除三种优化策略,并通过示例代码说明了这些技术的应用场景。
Java对象一定分配在堆上吗?
|
21天前
|
Java API
Java 对象释放与 finalize 方法
关于 Java 对象释放的疑惑解答,以及 finalize 方法的相关知识。
42 17
|
10天前
|
Java 大数据 API
14天Java基础学习——第1天:Java入门和环境搭建
本文介绍了Java的基础知识,包括Java的简介、历史和应用领域。详细讲解了如何安装JDK并配置环境变量,以及如何使用IntelliJ IDEA创建和运行Java项目。通过示例代码“HelloWorld.java”,展示了从编写到运行的全过程。适合初学者快速入门Java编程。
|
20天前
|
存储 安全 Java
Java编程中的对象序列化与反序列化
【10月更文挑战第22天】在Java的世界里,对象序列化和反序列化是数据持久化和网络传输的关键技术。本文将带你了解如何在Java中实现对象的序列化与反序列化,并探讨其背后的原理。通过实际代码示例,我们将一步步展示如何将复杂数据结构转换为字节流,以及如何将这些字节流还原为Java对象。文章还将讨论在使用序列化时应注意的安全性问题,以确保你的应用程序既高效又安全。
|
18天前
|
JavaScript Java 项目管理
Java毕设学习 基于SpringBoot + Vue 的医院管理系统 持续给大家寻找Java毕设学习项目(附源码)
基于SpringBoot + Vue的医院管理系统,涵盖医院、患者、挂号、药物、检查、病床、排班管理和数据分析等功能。开发工具为IDEA和HBuilder X,环境需配置jdk8、Node.js14、MySQL8。文末提供源码下载链接。
|
29天前
|
存储 Java 数据管理
Java零基础-Java对象详解
【10月更文挑战第7天】Java零基础教学篇,手把手实践教学!
24 6
|
26天前
|
设计模式 算法 Java
Java中的多态性:深入理解与应用
【10月更文挑战第16天】 在Java编程的广阔天地中,多态性作为一种强大的面向对象特性,扮演着至关重要的角色。它允许我们以统一的方式处理不同类型的对象,极大地提高了程序的灵活性和可扩展性。本文将深入浅出地探讨Java中多态性的概念、实现机制以及在实际开发中的应用,帮助读者更好地理解和运用这一特性。
|
20天前
|
存储 缓存 NoSQL
一篇搞懂!Java对象序列化与反序列化的底层逻辑
本文介绍了Java中的序列化与反序列化,包括基本概念、应用场景、实现方式及注意事项。序列化是将对象转换为字节流,便于存储和传输;反序列化则是将字节流还原为对象。文中详细讲解了实现序列化的步骤,以及常见的反序列化失败原因和最佳实践。通过实例和代码示例,帮助读者更好地理解和应用这一重要技术。
18 0
|
1月前
|
存储 前端开发 Java
你还没有对象吗?java带你创建一个吧
你还没有对象吗?java带你创建一个吧
12 0