Java强制转化示例代码详解

2025-03-25 15:50

本文主要是介绍Java强制转化示例代码详解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

《Java强制转化示例代码详解》:本文主要介绍Java编程语言中的类型转换,包括基本类型之间的强制类型转换和引用类型的强制类型转换,文中通过代码介绍的非常详细,需要的朋友可以参考下...

引入

Java编程语言中,类型转换(无论是强制类型转换还是自动类型转换)的方向并不是简单地基于“高位”和“低位”的概念,而是基于数据类型的范围和精度。

基本类型强制转换

1.数字之间

short s = 100;
int i = s; // 自动类型转换,安全

int j = 30000; // 一个大于short类型能表示的最大值的int
short k = (short) j; // 强制类型转换,可能导致数据丢失

上面给出了两种数值转换的概念,第一种是short转成int类型,由于short是16位的,int是32位的,此时就是低精度转为高精度,所以编译器会自动进行类型转换,是安全的,不用强转(因为这种转换是安全China编程的,不会丢失任何信息,只是简单地扩展了符号位)

而第二种则是让int类型转成short,高精度转低精度,不安全,强制类型转换,short只能存储低16位的数据,高16位的位置就舍弃了,所但凡int的高16位存有数据,此时的强转就会发生数据丢失。

所以通常而言,这种高精度强转低精度是没有意义的。

2.数字字符之间

引入

以前有涉及过steam,buffer的概念,并且它们本质都是数编程China编程组。

int c=23456;
char d=(char) c; //将int类型的c强转成char类型的d
System.out.println(d); //并且能够解析http://www.chinasem.cn输出

steam就是类似如下的一串二进制数字,在解析时以8位或32位等解析成十进制,就可以得到不同的结果:

Java强制转化示例代码详解

 int[] arr={23456,23457,34567,23876,32447};
 for(int x:arr){//解析输出
      char e=(char) x;
      System.out.println(e);        
 }                             

【以上就是两个基本类型强制转换的例子,而且基本类型之间都可以进行强转,只是有的没有意义。】

引用类型的强制转换

引入多态概念前提

e.g.首先,我们定义一个父类Animal,并在其中声明一个方法makeSound,但不在父类中实现它(可以将它设为抽象方法,但在这个例子中,我们为了简化,让它返回一个默认字符串)。然后,我们创建两个子类DogCat,它们都继承自Animal类,并各自实现了makeSound方法。

// 父类 Animal
class Animal {
    // 可以是一个抽象方法,但这里为了简化,我们提供一个默认实现
    public String makeSound() {
        return "Some generic animal sound";
    }
}

// 子类 Dog 继承自 Animal
class Dog extends Animal {
    @Override
    public String makeSound() {
        return "Woof! Woof!";
    }
}

// 子类 Cat 继承自 Animal
class Cat extends Animal {
    @Override
    public String makeSound() {
        return "Meow! Meow!";
    }
}

public class PolymorphismExample {
    public static void main(String[] args) {
        // 使用父类类型的引用来指向子类对象
        Animal myDog = new Dog();
        Animal myCat = new Cat();

        // 调用被重写的方法,将展示多态性
        System.out.println(myDog.makeSound()); // 输出: Woof! Woof!
        System.out.println(myCat.makeSound()); // 输出: Meow! Meow!

        // 尽管 myDog 和 myCat 都是 Animal 类型的引用,
        // 但它们实际上指向的是 Dog 和 Cat 对象,
        // 因此调用 makeSound 方法时会执行子类中的实现。
    }
}

在这个例子中,展示了多态性的两个关键方面:

父类引用指向子类对象myDog是一个Animal类型的引用,但它实际上指向了一个Dog对象。同样,myCat是一个Animal类型的引用,但它指向了一个Cat对象。

方法重写DogCat类都重写了Animal类中的makeSound方法。因此,当通过myDogmyCat引用调用makeSound方法时,会分别调用DogCat类中的实现。

以上例子展示了多态所遵守的两项,下面是完整的多态遵循条件:

要符合多态,通常需要满足以下几个条件:

继承:多态通常依赖于继承关系。在面向对象编程中,子类继承父类,从而可以重用父类的代码并扩展新的功能。多态性允许我们使用父类类型的引用来引用子类对象。

方法重写(Override):子类需要重写父类中的某些方法,以便在调用这些方法时能够表现出不同的行为。方法重写是多态性的关键所在,它允许子类提供父类方法的具体实现。

父类引用指向子类对象:这是多态性的另一个重要方面。我们可以创建一个父类类型的引用,并将其指向一个子类对象。当通过这个引用调用一个被重写的方法时,将调用子类中的该方法实现,而不是父类中的实现。

接口或抽象类:虽然多态性不一定需要接口或抽象类,但它们为多态性提供了强大的支持。接口和抽象类可以定义方法签名,而不提供具体实现。子类可以实现这些接口或继承这些抽象类,并提供具体的方法实现。这样,当使用接口或抽象类类型的引用来引用子类对象时,就可以实现多态性。

运行时类型识别(RTTI, Run-Time Type Identification):在Java等语言中,运行时类型识别是多态性的基础之一。它允许程序在运行时确定对象的实际类型,并根据这个类型来调用相应的方法。这是通过方法重写和父类引用指向子类对象来实现的。

【注意:虽然给出了这么多条件,但是多态性的核心在于方法重写和父类引用指向子类对象(句柄可以指向自己类的对象或者自己的子孙后代类的对象)这两个方面。】

【注意:引用类型之间的强制类型转换就没有这么自由了,会有诸多限制】

如下两个子类继承Person父类:

Java强制转化示例代码详解

Java强制转化示例代码详解

【注意:遵循一个类的句柄可以指向自己类的对象或者自己的子孙后代类的对象】

所以以下两种表达方式是错误的:

①直接报错:

Java强制转化示例代码详解

②运行时报错:

运行时报错是因为不符合多态,即“指向自己类的对象或者自己的子孙后代类的对象”,这里表示的是:

将s(指向Child2实例的Person类型变量)强转换成Child 3,Child2和Child3是兄弟关系,不符合多态。

Java强制转化示例代码详解

 如何解决以下问题呢?(o ∀ o )

有啦!!就用那招!((*)

引入关键字instanceof:

instanceof 是一个用于检查对象是否为特定类或其任何父类的实例的关键字。这个操作符返回一个布尔值:如果对象是指定类的实例,或者是该类的任何子类的实例,则返回 true;否则返回 false

if (object instanceof ClassName) {
    // 对象是指定类的实例或其子类的实例时执行的代码
}

其中:

  • object 是要检查的对象
  • ClassName 是要检查的类名(包括接口名)

还不理解没关系,以下给出一个实例:

class Animal {}
class Dog extends Animal {}
class Cat extends Animal {}

public class Main {
    public static void main(String[] args) {
        Animal myDog = new Dog();
        //Animal myDog = new Dog(); 创建了一个 Dog 类的实例,并将其引用赋值给 Animal 类型的变量 myDog。这意味着 myDog 指向的是一个 Dog 对象,但它在编译时被视为 Animal 类型。
        Animal myCat = new Cat();
       // Animal myCat = new Cat(); 类似地,创建了一个 Cat 类的实例,并将其引用赋值给 Animal 类型的变量 myCat。
        System.out.println(myDog instanceof Dog);    // 输出 true
        System.out.println(myDog instanceof Animal); // 输出 true
        System.out.println(myDog instanceof Cat);    // 输出 false
        System.out.println(myDog instanceof Object); // 输出 true

        System.out.println(null instanceof Animal);  // 输出 false
    }
}

在这个示例中,myDog 是 Dog 类的实例,也是 Animal 类和 Object 类的实例(因为所有类都继承自 Object)。因此,myDog instanceof Dog 返回 truemyDog instanceof Animal 也返回 true,但 myDog instanceof Cat 返回 false,因为 myDog 不是 Cat 的实例。同样地,null 不是任何类的实例,所以 null instanceof Animal 返回 false

public class Test{
    public static void main(String[] mmm) throws Exception{
        Child2 x=new Child2();
        //Child2 x = new Child2(); 创建了一个 Child2 类的实例,并将其引用赋值给 Child2 类型的变量 x。
        Child3 w=new Child3();
        //Child3 w = new Child3(); 创建了一个 Child3 类的实例,并将其引用赋值给 Child3 类型的变量 w。

        //句柄可以指向自己类的对象或者自己的子孙后代类的对象
        Person s=x; //父类指子类child2
        m1(s);
        
        s=w;
        m1(s);
        
        public static void m1(Person s){
            Child3 w=null;
            if(s instanceof Child3){
            //⭐使用instanceof关键字检查s是否是Child3的实例,如果是true,才进行下面的强转代码
               //⭐用instanceof来验证强转http://www.chinasem.cn⭐
                 w=(Child3) s;            
            }
                   
        }                                                           
    }
}

可以看见上面对m1() 方法进行了两次调用。

如果 s 指向的是 Child3 实例(在第二次调用 m1(s); 时),条件为真,代码块内的强转类型转换 w = (Child3) s; 会执行。如果 s 指向的是 Child2 实例(在第一次调用 m1(s); 时),条件为假,代码块内的代码不会执行。

总结

到此这篇关于Java强制转化的文章就介绍到这了,更多相关Java强制转化内容请搜索China编程(www.cppcns.cwww.chinasem.cnom)以前的文章或继续浏览下面的相关文章希望大家以后多多支持China编程(www.chinasem.cn)!

这篇关于Java强制转化示例代码详解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1153928

相关文章

Python装饰器之类装饰器详解

《Python装饰器之类装饰器详解》本文将详细介绍Python中类装饰器的概念、使用方法以及应用场景,并通过一个综合详细的例子展示如何使用类装饰器,希望对大家有所帮助,如有错误或未考虑完全的地方,望不... 目录1. 引言2. 装饰器的基本概念2.1. 函数装饰器复习2.2 类装饰器的定义和使用3. 类装饰

SpringBoot UserAgentUtils获取用户浏览器的用法

《SpringBootUserAgentUtils获取用户浏览器的用法》UserAgentUtils是于处理用户代理(User-Agent)字符串的工具类,一般用于解析和处理浏览器、操作系统以及设备... 目录介绍效果图依赖封装客户端工具封装IP工具实体类获取设备信息入库介绍UserAgentUtils

Spring 中的循环引用问题解决方法

《Spring中的循环引用问题解决方法》:本文主要介绍Spring中的循环引用问题解决方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录什么是循环引用?循环依赖三级缓存解决循环依赖二级缓存三级缓存本章来聊聊Spring 中的循环引用问题该如何解决。这里聊

MySQL 中的 JSON 查询案例详解

《MySQL中的JSON查询案例详解》:本文主要介绍MySQL的JSON查询的相关知识,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录mysql 的 jsON 路径格式基本结构路径组件详解特殊语法元素实际示例简单路径复杂路径简写操作符注意MySQL 的 J

pandas中位数填充空值的实现示例

《pandas中位数填充空值的实现示例》中位数填充是一种简单而有效的方法,用于填充数据集中缺失的值,本文就来介绍一下pandas中位数填充空值的实现,具有一定的参考价值,感兴趣的可以了解一下... 目录什么是中位数填充?为什么选择中位数填充?示例数据结果分析完整代码总结在数据分析和机器学习过程中,处理缺失数

Java学习手册之Filter和Listener使用方法

《Java学习手册之Filter和Listener使用方法》:本文主要介绍Java学习手册之Filter和Listener使用方法的相关资料,Filter是一种拦截器,可以在请求到达Servl... 目录一、Filter(过滤器)1. Filter 的工作原理2. Filter 的配置与使用二、Listen

Pandas统计每行数据中的空值的方法示例

《Pandas统计每行数据中的空值的方法示例》处理缺失数据(NaN值)是一个非常常见的问题,本文主要介绍了Pandas统计每行数据中的空值的方法示例,具有一定的参考价值,感兴趣的可以了解一下... 目录什么是空值?为什么要统计空值?准备工作创建示例数据统计每行空值数量进一步分析www.chinasem.cn处

Spring Boot中JSON数值溢出问题从报错到优雅解决办法

《SpringBoot中JSON数值溢出问题从报错到优雅解决办法》:本文主要介绍SpringBoot中JSON数值溢出问题从报错到优雅的解决办法,通过修改字段类型为Long、添加全局异常处理和... 目录一、问题背景:为什么我的接口突然报错了?二、为什么会发生这个错误?1. Java 数据类型的“容量”限制

Java对象转换的实现方式汇总

《Java对象转换的实现方式汇总》:本文主要介绍Java对象转换的多种实现方式,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录Java对象转换的多种实现方式1. 手动映射(Manual Mapping)2. Builder模式3. 工具类辅助映

SpringBoot请求参数接收控制指南分享

《SpringBoot请求参数接收控制指南分享》:本文主要介绍SpringBoot请求参数接收控制指南,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Spring Boot 请求参数接收控制指南1. 概述2. 有注解时参数接收方式对比3. 无注解时接收参数默认位置