• 【java学习—七】多态性(34)



    1. 概念

    • 多态性,是面向对象中最重要的概念,在 java 中有两种体现:
      (1)方法的重载 (overload) 和重写 (overwrite) 。

          重载:本类中的同名方法,体现相同的名称方法实现不同的逻辑
          重写:子类对父类方法的覆盖,子类可以使用和父类相同的方法名,覆盖掉父类的逻辑;对于父类的方法,子类想修改逻辑,但是有别的代码在调用父类的方法,可以考虑用子类继承父类,重写父类的方法。

        (2)对象的多态性 ——可以直接应用在抽象类接口上。(后面再讲)
            Java 引用变量有两个类型:编译时类型运行时类型。编译时类型由声明该变量时使用的类型决定,运行时类型由实际赋给该变量的对象决定。若编译时类型运行时类型不一致,就出现多态( Polymorphism ),这是对象的多态。

    2. 对象的多态

    2.1. 一

    • 在 Java 中 , 子类的对象可以替代父类的对象使用
      (1)一个变量只能有一种确定的数据类型
      (2)一个引用类型变量可能指向 ( 引用 ) 多种不同类型的对象,例子如下:

    Person p = new Person();
    Person e = new Student(); // Person 类型的变量 e指向 Student 类型的对象

    代码示例:

    package day07;
    
    public class Student extends Person {
    	String school;
    	
    	public static void main(String[] args) {
    		
    //		Person p = new Person();
    //		Student s = new Student();
    //-----------以上是正常的情况-----------------------------
    
    
    		Person e = new Student();//父类的引用对象可以指向子类的实例
    		
    		Person p = new Person();
    		p = new Student();
    		//问题:当前这个引用对象p引用的是哪个实例对象?
    		}
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    答案:
    在这里插入图片描述
    结论:子类可看做是特殊的父类,所以父类类型的引用可以指向子类的对象:向上转型 (u
    pcasting):把子类的对象可以给父类类型的变量引用 。

    2.2. 二

    • 一个引用类型变量如果声明为父类的类型,但实际引用的是子类对象,那么该变量就不能再访问子类中添加的属性和方法。

    在这里插入图片描述

    解释:属性是在编译时确定的,编译时 e 为 Person 类型,没有 school 成员变量,因而编译错误。

    3. 虚拟方法的调用

    package day07;
    
    public class Student extends Person {
    	String school;
    	
    	@Override
    	public void showInfo() {
    		System.out.println("以下是student类对Person类的showInfo方法的重写");
    		System.out.println(this.age);
    		System.out.println(this.name);
    		System.out.println(this.sex);
    	}
    	
    
    	public static void main(String[] args) {
    
    		System.out.println("---------Student类正常调用------------");
    		Student s = new Student();
    		s.showInfo();
    		
    		System.out.println("----------Person类正常调用-----------");
    		Person p = new Person();
    		p.showInfo();
    		
    		System.out.println("----------虚拟方法调用(多态情况下)-----------");
    		Person e = new Student();
    		e.showInfo();//(父类)Person调用(子类)Stduent的getInfo()方法
    		//问题:在目前情况下,e.showInfo()会调用Person类的showInfo()还是Student的showInfo()?
    		}
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31

    运行结果:
    在这里插入图片描述
    结论:编译时 e 为 Person 类型,而方法的调用是在运行时确定的,所以调用的是 Student类的 getInfo() 方法——动态绑定

    4. 总结

    在这里插入图片描述

  • 相关阅读:
    运行软件后报错“未找到api-ms-win-core-com-l1-1-0.dll”
    IDEA中添加servlet模板
    【Obsidian样式】修改文件夹名称和文件名称前的图标
    为什么说log用占位符比用字符串连接比较好
    【Java Web】Spring整合Kafka
    2023年09月IDE流行度最新排名
    采购管理软件:如何快速实现采购申请自动化流转?
    stm32f4xx-RTC实时时钟_calendar_alarm
    C++面试八股文:什么是构造函数?
    Go Slice 排除异己
  • 原文地址:https://blog.csdn.net/weixin_44883789/article/details/133845325