【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不是人
相关文章
|
4月前
|
IDE Java 编译器
java编程最基础学习
Java入门需掌握:环境搭建、基础语法、面向对象、数组集合与异常处理。通过实践编写简单程序,逐步深入学习,打牢编程基础。
310 1
|
5月前
|
Java API 容器
Java基础学习day08-2
本节讲解Java方法引用与常用API,包括静态、实例、特定类型方法及构造器引用的格式与使用场景,并结合代码示例深入解析。同时介绍String和ArrayList的核心方法及其实际应用。
181 1
|
4月前
|
设计模式 网络协议 数据可视化
Java 设计模式之状态模式:让对象的行为随状态优雅变化
状态模式通过封装对象的状态,使行为随状态变化而改变。以订单为例,将待支付、已支付等状态独立成类,消除冗长条件判断,提升代码可维护性与扩展性,适用于状态多、转换复杂的场景。
492 0
|
4月前
|
存储 Oracle Java
java零基础学习者入门课程
本课程为Java零基础入门教程,涵盖环境搭建、变量、运算符、条件循环、数组及面向对象基础,每讲配示例代码与实践建议,助你循序渐进掌握核心知识,轻松迈入Java编程世界。
437 0
|
4月前
|
负载均衡 Java API
grpc-java 架构学习指南
本指南系统解析 grpc-java 架构,涵盖分层设计、核心流程与源码结构,结合实战路径与调试技巧,助你从入门到精通,掌握高性能 RPC 开发精髓。
518 7
|
5月前
|
Java
Java基础学习day08-作业
本作业涵盖Java中Lambda表达式的应用,包括Runnable与Comparator接口的简化实现、自定义函数式接口NumberProcessor进行加减乘及最大值操作,以及通过IntProcessor处理整数数组,实现遍历、平方和奇偶判断等功能,强化函数式编程实践。
98 5
|
5月前
|
Java 程序员
Java基础学习day08
本节讲解Java中的代码块(静态与实例)及其作用,深入介绍内部类(成员、静态、局部及匿名)的定义与使用,并引入函数式编程思想,重点阐述Lambda表达式及其在简化匿名内部类中的应用。
177 5
|
5月前
|
Java
Java基础学习day07-作业
本作业包含六个Java编程案例:1)动物类继承与多态;2)加油卡支付系统;3)员工管理类设计;4)学生信息统计接口;5)USB设备控制;6)家电智能控制。综合运用抽象类、接口、继承、多态等面向对象技术,强化Java基础编程能力。
229 3
|
5月前
|
Java
Java基础学习day06-作业
本内容为Java基础学习作业,涵盖两个案例:一是通过Card类及其子类GoldenCard、SilverCard实现加油卡系统,体现封装与继承;二是通过Shape类及子类Circle、Rectangle演示多态与方法重写,强化面向对象编程理解。
116 1
|
5月前
|
设计模式 存储 Java
Java基础学习day07
本节讲解Java中的final关键字、单例设计模式、枚举类、抽象类与接口。涵盖常量定义、单例写法(饿汉式/懒汉式)、枚举特点及应用场景,以及抽象类与接口的使用与区别,助力掌握核心面向对象编程思想。
214 1