返回顶部
首页 > 资讯 > 后端开发 > Python >Java 之类型转换与多态详情
  • 686
分享到

Java 之类型转换与多态详情

2024-04-02 19:04:59 686人浏览 泡泡鱼

Python 官方文档:入门教程 => 点击学习

摘要

目录一、类型检查二、基本类型转换三、upcast与多态四、downcast五、Object类型一、类型检查 Java的任意变量和引用经过类型声明(type declaration),

一、类型检查

Java的任意变量和引用经过类型声明(type declaration),才能使用。我们之前见过对象数据、类数据、方法参数、方法返回值以及方法内部的自动变量,它们都需要声明其类型。Java是一种强类型(strongly typing)语言,它会对类型进行检查。如果我们错误的使用类型,将造成错误。

比如在下面的Test类中,我们将一个Cup类对象赋予给aPerson类引用:


public class Test
{
    public static void main(String[] args)
    {
        Human aPerson;            
        aPerson = new Cup();     
    }
}

class Human
{   
    
    public Human(int h)
    {
        this.height = h;
    }

    
    public int getHeight()
    {
       return this.height;
    }

    
    public void growHeight(int h)
    {
        this.height = this.height + h;
    }

    private int height;
}

class Cup 
{
    public void addWater(int w) 
    {
        this.water = this.water + w;
    }

    public void drinkWater(int w)
    {
        this.water = this.water - w;
    }

    private int water = 0;
}

javac将返回:


found   : Cup
required: Human
                aPerson = new Cup();             
                          ^
1 error

二、基本类型转换

Java可以对基本类型的变量进行类型转换。不同的基本类型有不同的长度和存储范围。如果我们从一个高精度类型转换到低精度类型,比如从float转换到int,那么我们有可能会损失信息。这样的转换叫做收缩变换(narrowing conversion)。这种情况下,我们需要显示的声明类型转换,比如:


public class Test
{
    public static void main(String[] args)
    {
        int a;
        a = (int) 1.23;  // narrowing conversion
        System.out.println(a);
    }
} 

如果我们从低精度类型转换成高精度类型,则不存在信息损失的顾虑。这样的变换叫做宽松变换(widening conversion)。我们不需要显示的要求类型转换,Java可以自动进行:


public class Test
{
    public static void main(String[] args)
    { 
        int a = 3;
        double b;
        b = a;  // widening conversion
        System.out.println(a);
    }
}

 基本类型转换流程图:

 

三、upcast与多态

在Java中,引用也可以进行类型转换,但是有限制。

 我们可以将一个衍生类引用转换为其基类引用,这叫做向上转换(upcast)或者宽松转换。下面的BrokenCup类继承自Cup类,并覆盖了Cup类中原有的addWater()和drinkWater()方法:


 
public class Test
{
    public static void main(String[] args)
    { 
        Cup aCup;
        BrokenCup aBrokenCup = new BrokenCup();
        aCup = aBrokenCup; // upcast
        aCup.addWater(10); // method binding
    }
}

class Cup 
{
    public void addWater(int w) 
    {
        this.water = this.water + w;
    }

    public void drinkWater(int w)
    {
        this.water = this.water - w;
    }

    private int water = 0;
}

class BrokenCup extends Cup
{
    public void addWater(int w) 
    {
        System.out.println("shit, broken cup");
    }

    public void drinkWater(int w)
    {
        System.out.println("om...num..., no water inside");
    }
}

程序运行结果:

shit, broken cup

在上面可以看到,不需要任何显示说明,我们将衍生类引用aBrokenCup赋予给它的基类引用aCup。类型转换将由Java自动进行。

我们随后调用了aCup(我们声明它为Cup类型)的addWater()方法。尽管aCupCup类型的引用,它实际上调用的是BrokenCupaddWater()方法!也就是说,即使我们经过upcast,将引用的类型宽松为其基类,Java依然能正确的识别对象本身的类型,并调用正确的方法。Java可以根据当前状况,识别对象的真实类型,这叫做多态(polymorphism)。多态是面向对象的一个重要方面。

多态是Java的支持的一种机制,同时也是面向对象的一个重要概念。这提出了一个分类学的问题,既子类对象实际上“是”父类对象。比如一只鸟,也是一个动物;一辆汽车,也必然是一个交通工具Java告诉我们,一个衍生类对象可以当做一个基类对象使用,而Java会正确的处理这种情况。

比如下面的继承关系:

 

我们可以说用杯子(Cup)喝水(drinkWater)。实际上,喝水这个动作具体含义会在衍生类中发生很大变换。比如用吸管喝水,和从一个破杯子喝水,这两个动作差别会很大,虽然我们抽象中都讲“喝水”。我们当然可以针对每个衍生类分别编程,调用不同的drinkWater方法。然而,作为程序员,我们可以对杯子编程,调用CupdrinkWater()方法,而无论这个杯子是什么样的衍生类杯子。Java会调用相应的正确方法,正如我们在上面程序中看到的。

看一个更加有意义的例子,我们给Human类增加一个drink()方法,这个方法接收一个杯子对象和一个整数作为参数。整数表示喝水的水量:


public class Test
{
    public static void main(String[] args)
    {
        Human guest = new Human();
        BrokenCup hisCup  = new BrokenCup();
        guest.drink(hisCup, 10);
    }
}

class Human 
{
    void drink(Cup aCup, int w)
    {
        aCup.drinkWater(w);
    }
}

程序运行结果:

shit, no water inside

我们在Human类的drink()的定义中,要求第一个参量为Cup类型的引用。但在实际运用时(Test类),将CupBrokenCup衍生类对象。这实际上是将hisCup向上转型称为Cup类,传递给drink()方法。在方法中,我们调用了drinkWater()方法。Java发现这个对象实际上是BrokenCup对象,所以实际调用了BrokenCup的相应方法。

四、downcast

我们可以将一个基类引用向下转型(downcast)成为衍生类的引用,但要求该基类引用所指向的对象,已经是所要downcast的衍生类对象。比如可以将上面的hisCup向上转型为Cup类引用后,再向下转型成为BrokenCup类引用。

五、Object类型

Java中,所有的类实际上都有一个共同的继承祖先,即Object类Object类提供了一些方法,比如toString()。我们可以在自己的类定义中覆盖这些方法。

 

Object: 祖先

我们可以编写一个操作Object对象的程序,就可以通过upcast,将任意对象传递给该程序。

我将在以后深入Object类

多态的实现是依靠RTTI的支持

到此这篇关于Java 之类型转换与多态详情的文章就介绍到这了,更多相关Java 之类型转换与多态内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Java 之类型转换与多态详情

本文链接: https://lsjlt.com/news/135447.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Java 之类型转换与多态详情
    目录一、类型检查二、基本类型转换三、upcast与多态四、downcast五、Object类型一、类型检查 Java的任意变量和引用经过类型声明(type declaration),...
    99+
    2024-04-02
  • Java之int和string类型转换详解
    int、String的类型转换 int -> String int i=12345; String s=""; 第一种方法:s=i+""; 第二种方法:s=String.val...
    99+
    2024-04-02
  • java如何实现类型转换与强制类型转换
    这篇文章主要介绍了java如何实现类型转换与强制类型转换,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。java类型转换与强制类型转换如果你以前有编程经验,那么你已经知道把一种...
    99+
    2023-06-03
  • Python教程之类型转换详解
    目录隐式类型转换显式类型转换Python 定义了类型转换函数以将一种数据类型直接转换为另一种数据类型,这在日常和竞争性编程中很有用。本文旨在提供有关某些转换函数的信息。 Python...
    99+
    2024-04-02
  • java的类型转换
    有关int与string的互转[@more@]如何将字串 String 转换成整数 int A. 有两个方法: 1). int i = Integer.parseInt([String]); 或 i = Integer.parseInt([...
    99+
    2023-06-03
  • go类型转换及与C的类型转换方式
    GO类型转换及与C的类型转换 类型转换 语法 dst := float32(src) 示例 var num int = 520 f32 := float32(num) i6...
    99+
    2022-06-07
    GO
  • Java数据类型分类与基本数据类型转换
    目录1.数据类型的分类2.基本数据类型转换(1)自动类型转换(2)强制类型转换 1.数据类型的分类 Java的数据类型主要分为两类:基本数据类型、引用数据类型 Java中...
    99+
    2024-04-02
  • JavaScript中类型的强制转换与隐式转换详解
    目录一、隐式转换双等号里的转换 Boolean 类型转换 "+" 与 "-" 二、强制类型转换 new String 与 ' ' 总结一、隐式转换 以下语句的执行结果是什么? A...
    99+
    2024-04-02
  • Java基本数据类型之间的相互转换详解
    目录1.自动类型转换1.定义2.数据类型按精度大小排序3.使用细节2.强制类型转换1.定义2.使用细节3.基本数据类型与String类型的转换1.基本数据类型转String类型2.S...
    99+
    2024-04-02
  • C++类型转换详解
    目录内置类型的转换自定义类型转换explicit 关键字提醒提问:编译器在什么时候使用Stone(double)?转换函数概念介绍自动引用类型转换缺陷总结C++对于内置类型有...
    99+
    2024-04-02
  • Javascript类型转换详解
    目录类型转换1.String->Number2.Number->String3.混合String->Number4.String->Array5.Array-...
    99+
    2024-04-02
  • Java之String类型的编码方式转换
    目录String类型的编码方式转换String字符集的编码和解码String编码String解码总结String类型的编码方式转换 在JAVA中,String类型的编码方式转换,St...
    99+
    2023-02-28
    Java String类型 String类型编码 String类型编码转换
  • Java 多态中继承的转型详解与用法分析
    目录一、前言二、转型向上转型向下转型三、instanceof运算符instanceof的用处instanceof的使用格式:一、前言 前面我们学习了多态的概述和使用,现在我们来学习前...
    99+
    2024-04-02
  • 浅谈C++类型转换几种情况
    目录0. 类型转换的原理1. 初始化和赋值时进行的转换2. 以{}方式初始化时进行的转换(C++11新增)3. 表达式中的转换4. 传递参数时的转换5. 强制类型转换6. 使用aut...
    99+
    2024-04-02
  • [Java List类型和Map类型想换转换案例]
    目录 1. List转Map 2. Map转List 3. List转Map并保留重复Key 4. Map转List并保留Key值 5 简单版 可以通过遍历List,将List中的元素转换为Map中的键值对 6:通过遍历Map,将Map中...
    99+
    2023-09-11
    java 开发语言
  • java DateUtil工具类时间戳类型转换详解
    本文实例为大家分享了DateUtil工具类时间戳类型转换的具体代码,供大家参考,具体内容如下package com.sinosoft.media.sms.util; import java.text.ParseException; impo...
    99+
    2023-05-30
    java dateutil dat
  • Java数据类型转换的示例详解
    目录自动转换转换原理转换规则强制转换注意ASCII编码表Java程序中要求参与的计算的数据,必须要保证数据类型的一致性,如果数据类型不一致将发生类型的转换。 自动转换 一个int 类...
    99+
    2024-04-02
  • 【Java 基础篇】Java 类型转换
    文章目录 导言一、隐式类型转换1. 整型隐式类型转换2. 浮点型隐式类型转换3. 字符型隐式类型转换4. 布尔型隐式类型转换 二、显式类型转换1. 整型显式类型转换2. 引用数据类型显式...
    99+
    2023-09-22
    java 开发语言
  • golang类型推断与隐式类型转换
    目录前言一、常量的隐式类型转换1.常量的声明2.常量的类型转换3.隐式转换的原理二、变量的类型推断1.类型推断的原理三、类型推断示例分析总结前言 golang类型推断可以省略类型,像...
    99+
    2024-04-02
  • 【Java基础】java中Long与String类型相互转换
    一、Long类型 转 String类型 Long 转 String 两种方法: 1:String str = String.valueOf(Long val); 2:String str = Long.toString(Long val);...
    99+
    2023-08-20
    java
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作