IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> Java三大特性之多态 -> 正文阅读

[Java知识库]Java三大特性之多态

目录

多态概述

强制类型转换

向上转型和向下转型

实例演示

多态的应用环境

抽象类

小结


多态概述

Java有三大特性:封装、继承和多态。

? 那么什么是多态呢?所谓多态就是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,而是在程序运行期间才确定,即一个引用变量倒底会指向哪个类的实例对象,该引用变量发出的方法调用到底是哪个类中实现的方法,必须在由程序运行期间才能决定。

多态意味着父类型的变量可以引用子类型的对象。

?继承关系使一个子类能继承父类的特征,并且附加一些新特征。子类是它的父类的特殊化,每个子类的实例都是其父类的实例,但是反过来不成立。例如:每个圆都是一个几何对象,但并非每个几何对象都是圆。因此,总可以将子类的实例传给需要父类型的参数。
?

强制类型转换

在了解多态之前,让我们先了解一下类型转换,因为多态本身是一种向上转型

  1. 向上转型不要强制转型
  2. 父类引用指向的或者调用的方法是子类的方法,这个叫动态绑定
  3. 向上转型后父类引用不能调用子类自己的方法
double Steve_speed = 233.33;
int now_Steve_speed = (int) Steve_speed;

向上转型和向下转型

public class I_am_AaaaT {
	    public void sleep() {
	        System.out.println("Now is moonlight");
	    }

	    public static void main(String[] args) {
	        AaaaT m = new AaaaT();
	        m.sleep();

	        AaaaT h = new AaaaT();// (1)向上转型
	        h.sleep(); // (2)动态绑定
	        // h.speak(); // (3)此方法不能编译,报错说I_am_AaaaT类没有此方法

	        //         // [1]向下转型
	        //         AaaaT m2 = new AaaaT();
	        //         I_am_AaaaT h2 = m2;  
	        //         m2 = (AaaaT) h2;         
	        //         m2.speak(); 
	        //         
	        //         // [2]向下转型:失败
	        //         I_am_AaaaT h3 = new I_am_AaaaT();
	        //         AaaaT m3 = (AaaaT)h3;
	        //         m3.speak();     //此时会出现运行时错误,所以可以用instanceOF判断 
	        //        
	        //         // [3]向下转型:类型防护
	        //         I_am_AaaaT h4 = new I_am_AaaaT();
	        //         if (h4 instanceof AaaaT){ // 因为h4不是AaaaT的实例,所以不执行if内部代码
	        //             AaaaT m4 = (AaaaT)h4;
	        //             m4.speak();
	        //         }

	    }
	}

	class Steve extends I_am_AaaaT {
	    @Override
	    public void sleep() {
	        System.out.println("AaaaT sleep.");
	    }

	    public void speak() {
	        System.out.println("I am AaaaT.");
	    }
	}

	class Alex extends I_am_AaaaT {
	    @Override
	    public void sleep() {
	        System.out.println("CcccT sleep.");
	    }

	    public void speak() {
	        System.out.println("I am CcccT.");
	    }
	}

在这里还可以用 instanceof 判断类型

实例演示

我们平常讲的Java的三大特性之多态多指多态的动态绑定,有三个必要条件:

  • 继承
  • 重写
  • 父类引用指向子类对象(向上转型)
  • public class Test {
        public static void main(String[] args) {
           Animal a=new Cat();  // 向上转型 变成父类型
           // 编译时a被认为是Animal类型,运行时被认为是子类型
           Animal b=new Dog();  // 向上转型
           a.eat();   //调用的是子类的方法
           a.work();
           Cat c = (Cat)a;  //向下转型 变成子类型
           Dog d = (Dog)b;
           c.eat();
           d.eat();
    
        }
    }
    class Cat extends Animal{
     //   @Override
        public void eat() {
            System.out.println("吃鱼");
        }
    }
    
    class Dog extends Animal{
    //    @Override
        public void eat() {
            System.out.println("吃骨头");
        }
    }
    class Animal{
        public void eat(){
            System.out.println("吃啥呢");
        }
        public void  work(){
         	System.out.println("验证a的内部是Animal类型");
         }
         
    
    }
    
    
    

    在这里插入图片描述

    ?

多态的应用环境

多态:基类型对象访问派生类重写的方法

  • 循环调用基类对象,访问不同派生类方法
  • 自定义函数,实参是派生类,行参是基类
  • 一般不单独使用,和抽象类等配合使用

抽象类

抽象方法是出现在基类中的一种方法,但要求在派生类中被重写。
?一个抽象方法只有方法头,没有方法主体
包含抽象方法的类就会自动办成抽象类,隐刺必须以abstract关键字声明。
抽象方法会被用来确保派生类会实现这个方法
若类含有抽象方法,则类必须以abstract关键字声明为抽象类

eg.public abstract class


抽象类可以含零或多个普通方法,也可以含零或多个抽象方法
不论抽象类是否含有抽象方法,其都不允许实例化,即不能创建抽象类的对象,因为其描述的是抽象概念。它只能作为其他类的基类。
若父类是抽象类,且子类不想成为抽象类,则子类必须将父类中所有抽象方法重写为带方法体的普通方法,否则子类仍必须是抽象类。
?

小结

?多态虽然对于初学者来说,有一些难以理解,但其特性动态绑定在实际项目中非常有用,能减少很多繁杂的代码,减轻工作量的同时,其灵活性也大大提高了代码的扩展性,能够避免不同子类的差异,简化程序,使我们的程序更加通用。

在面向对象编程的时候,我们遇到的对象通常都会具有多种特性,我们想要实现一个对象的编程过程,就需要用到Java的三大特性。如果说,封装是创造了一个初具人形的发条人偶,继承则是给它装上了工具,而多态则为这个人偶赋予了独有的灵魂和思想。

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2021-12-10 10:55:44  更:2021-12-10 10:57:00 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 7:01:53-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码