返回顶部
首页 > 资讯 > 精选 >怎么在java中对对象的类型进行转换
  • 209
分享到

怎么在java中对对象的类型进行转换

java 2023-05-30 23:05:11 209人浏览 八月长安
摘要

怎么在java中对对象的类型进行转换?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。对象类型转换分为向上转型和向下转型(强制对象转型)。 向上转型是子对象向父对象转型的过程,例如

怎么在java中对对象的类型进行转换?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。

对象类型转换

分为向上转型和向下转型(强制对象转型)。 向上转型是子对象向父对象转型的过程,例如猫类转换为动物类;向下转型是强制转型实现的,是父对象强制转换为子对象。 这和基础数据类型的转换是类似的,byte在需要时会自动转换为int(向上转型),int可以强制转型为byte(向下转型)。

对于对象转型来说, 向上转型后子对象独有的成员将不可访问 。 意思是,在需要一只动物时,可以把猫当作一只动物传递,因为猫继承自动物,猫具有动物的所有属性。但向上转型后,猫不再是猫,而是被当作动物看待,它自己独有的属性和方法就不可见了。换句话说,向上转型后,只能识别父对象中的内容。

可以通过"引用变量 instanceof 类名"的方式来判断引用变量 所指向的对象 是否属于某个类,也就是说"对象是不是某类",例如声明一个猫类对象的引用"Cat c",然后"c instanceof Animal"表述的意思是"对象c是一种动物吗?"对于instanceof返回true的对象,都可以转换为类对象,只不过有些可能需要强制转换。

向上转型可以自动进行,这本就是符合逻辑的,狗类继承自动物类,它本身就是一只动物,因此在需要动物类的时候,丢一只狗过去就会自动向上转型成动物类。但这时狗已经不是狗,而是动物,所以狗独有的成员不再可见。

强制转换的方式和基础数据类型强制转换一样,都是在待转换对象前加上目标类型,例如将动物a强制转换为狗d: Dog d = (Dog)a 。

下面是一个对象类型转换的示例,很好地分析了能否转型、转型后能否访问某些成员等等。

class Animal { String name; Animal(String name) {this.name = name;}}class Cat extends Animal { String eyecolor; Cat(String name,String color) {super(name); this.eyecolor = color;}}class Dog extends Animal { String furcolor; Dog(String name,String color) {super(name); this.furcolor = color;}}public class OCast { public static void main(String [] args) { Animal a = new Animal("animal"); Cat c = new Cat("cat","blue"); Dog d = new Dog("dog","black"); System.out.println( a instanceof Animal);//return true System.out.println( c instanceof Animal);//return true System.out.println( d instanceof Animal);//return true System.out.println( a instanceof Cat); //return false System.out.println(a.name); //return animal a = new Dog("yellowdog","yellow"); //object Dog upcast to Animal System.out.println(a.name);  //return yellowdog System.out.println(a instanceof Animal); //return true System.out.println(a instanceof Dog); //return true //System.out.println(a.furcolor); //error! because a was regarded as Animal Dog d1 = (Dog)a; // because "a instanceof Dog" is true,so force cast Animal a to Dog System.out.println(d1.furcolor);  //return yellow }}

对于上面的 a = new Dog("yellowdog",yellow) ,a是Animal类型,但此时 它指向的是Dog对象。也就是说它是Dog,所以也是Animal类 ,所以 a instanceof Animal); 和 a instanceof Dog; 都是true,这是它的"指针"决定的。 但因为它的类型是Animal类型,类型决定了能存储什么样的数据,对于已经存在的但不符合类型的数据都是不可见的,所以Animal类型决定了它只能看到Dog对象中的Animal部分 。

如下图:

怎么在java中对对象的类型进行转换

既然可以向上转型,配合instanceof的逻辑判断,就能实现很好的扩展性。例如,动物类的sing(Animal a)方法需要的是一个动物类,可以给它一只狗d,这时会向上转型(就像需要double类型却给了一个int数据一样),虽然转型了,但狗d的实际引用仍然是Dog对象,于是 if (a instanceof Dog) 判断为真,则调用能体现狗sing()方法特殊性的语句。如果传递一只猫,if判断一下并调用能体现猫sing()方法特殊性的语句。这样,任何时候想添加一只动物,都只需要增加一条if语句就可以了。

见下面的示例:

class Animal { String name; Animal(String name) { this.name = name; }}class Cat extends Animal {Cat(String name) {super(name);}}class Dog extends Animal {Dog(String name) {super(name);}}public class TestCast { public static void main(String [] args) { TestCast t = new TestCast();  Animal a = new Animal("animal"); Animal c = new Cat("cat"); Animal d = new Dog("dog"); t.sing(a);t.sing(c);t.sing(d); } void sing(Animal a) { if ( a instanceof Cat) {  Cat cat = (Cat)a;  System.out.println("cat is singing"); } else if(a instanceof Dog) {  Dog dog = (Dog)a;  System.out.println("dog is singing"); } else {  System.out.println("not an instance of animal"); } }}

如果没有对象转型,那么Dog里要定义一次sing(),Cat里也要定义一次sing()。要增加一个动物类,动物类里也还要定义一次sing()。现在就方便多了,直接在sing()方法内部修改if语句就可以了。

注意,上面的sing()方法不属于Animal或其他子类的方法,而是独立定义在其他类里进行调用的。

多态

向上转型虽然在一定程度上提高了可扩展性,但提高的程度并不太高。以向上转型为基础,java的多态实现的扩展性更好更方便。

多态也叫动态绑定或后期绑定,它是执行期间进行的绑定,而非编译期间的绑定(这是静态绑定或称为前期绑定)。

多态的原理是:当向上转型后,调用一个被重写的方法时,本该调用的是父类方法,但实际上却会动态地调用子类重写后的方法。实际上,编译期间绑定的确实是父类方法,只不过在执行期间动态转调子类对应方法。

例如,Animal类的sing()方法,Cat和Dog类都重写了sing()方法。当需要一个Animal对象时,传递了一个Cat类,那么将调用Cat的sing()方法。动态绑定的逻辑正如下面的代码类似:

void sing(Animal a) { if ( a instanceof Cat) { Cat cat = (Cat)a; System.out.println("cat is singing"); } else if(a instanceof Dog) { Dog dog = (Dog)a; System.out.println("dog is singing"); } else { System.out.println("not an instance of animal"); }}

以下是一个多态的例子

class Animal { private String name; Animal(String name) {this.name = name;} public void sing(){System.out.println("animal sing...");}}class Cat extends Animal { private String eyeColor; Cat(String n,String c) {super(n); eyeColor = c;} public void sing() {System.out.println("cat sing...");}}class Dog extends Animal { private String furColor; Dog(String n,String c) {super(n); furColor = c;} public void sing() {System.out.println("dog sing...");}}class Lady { private String name; private Animal pet; Lady(String name,Animal pet) {this.name = name; this.pet = pet;} public void myPetSing(){pet.sing();}}public class DuoTai { public static void main(String args[]){ Cat c = new Cat("catname","blue"); Dog d = new Dog("dogname","black"); Lady l1 = new Lady("l1",c); Lady l2 = new Lady("l2",d); l1.myPetSing(); l2.myPetSing(); }}

编译后的执行结果为:

cat sing...dog sing...

在上面的示例中,Lady类的构造方法和她调用sing()方法的代码为:

Lady(String name,Animal pet) {this.name = name; this.pet = pet;}public void myPetSing(){pet.sing();}

如果构造出Lady对象的pet是Cat对象c,这个c首先会向上转型为Animal类,也就是说Lady的pet属性虽然指向的是"Cat c"对象,但它只能看见其中的父对象Animal部分。那么 myPetSing(pet.sing();) 方法自然会调用Animal类的sing()方法。 以上过程是编译器所认为的过程,也是静态绑定或前期绑定的过程。

但编译完成后,虽然pet属性只能看见Animal部分,但实际在执行时pet.sing()却换转换为执行c.sing()。就相当于做了一次对象类型强制转换 Cat petx = (Cat)pet 。 这是动态绑定或后期绑定的过程,也称为多态。

实际上,对象在被new出来后,它所涉及到的方法都放在code segment内存区中的一个方法列表中,这个列表中包含了子类、父类的方法,只不过有些时候不可见的方法无法去调用。当执行程序时,内部的机制可以从方法列表中搜索出最符合环境的方法并执行它。

实现多态的技术的关键点在于:

(1). 定义一个父类引用f,并将其指向子类对象,即进行向上转型 ;

(2). 重写父类的方法,并使用父类引用f去引用这个方法。这样就可以面向父类进行编程

正如上面的示例中,将pet定义为Animal类而非具体的子类,并在方法中调用pet.sing()。如此依赖,就无需考虑pet到底是Cat/Dog,在进行功能扩展添加Bird类时,完全不用再修改Lady类的这段代码。

再例如,父类Animal,子类Dog,方法sing()。

class Animal {public void sing(A);}class Dog extends Animal {public void sing(B);}public class Test { Animal a = new Dog(); //父类引用变量a指向子对象Dog,此时将向上转型 a.sing();  //使用父类引用变量a引用被重写的方法sing(),执行时将动态绑定到Dog的sing()}

看完上述内容,你们掌握怎么在java中对对象的类型进行转换的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注编程网精选频道,感谢各位的阅读!

--结束END--

本文标题: 怎么在java中对对象的类型进行转换

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

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

猜你喜欢
  • 怎么在java中对对象的类型进行转换
    怎么在java中对对象的类型进行转换?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。对象类型转换分为向上转型和向下转型(强制对象转型)。 向上转型是子对象向父对象转型的过程,例如...
    99+
    2023-05-30
    java
  • 在java中怎么对数据类型进行进制转换
    在java中怎么对数据类型进行进制转换?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。在java中Int 类型的变量占 4个字节Long 类型的变量占8个字节一个程序就是一个...
    99+
    2023-05-31
    java ava 数据类
  • golang怎么对interface类型进行转换
    Go语言中的interface是一个非常特殊的类型,它可以抽象出任何具有一定特征的数据类型,并且可以进行类型转换。这一特性使得interface在Go语言中发挥着非常重要的作用,但是interface类型的转换也是一个比较复杂的问题,需要我...
    99+
    2023-05-14
    interface go语言 Golang
  • 怎么在java中对SimpleDateFormat进行转换
    怎么在java中对SimpleDateFormat进行转换?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。Java可以用来干什么Java主要应用于:1. web开...
    99+
    2023-06-14
  • C# 中怎么对数据类型进行转换
    本篇文章给大家分享的是有关C# 中怎么对数据类型进行转换,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。一、函数方法下面罗列的函数方法不是全部,仅列举一些常用的double这种有...
    99+
    2023-06-20
  • golang怎么进行对象转换
    Golang是一门非常流行的编程语言,它拥有高效、简洁、安全等特点,在大数据、网络编程和云计算领域都有广泛应用。在Golang中,对象转换也是非常重要的操作之一,如果不熟悉对象转换,将很难完成功能的开发。本文将重点介绍Golang中对象转换...
    99+
    2023-05-14
  • golang 对象类型转换
    随着 Go 语言的不断发展和应用,越来越多的开发者开始使用它来构建高效、可靠的应用程序。在使用 Go 进行开发的过程中,经常会遇到需要进行对象类型转换的情况。本文将为你介绍 Go 语言中的对象类型转换,帮助你更好地理解和应用这一重要的特性。...
    99+
    2023-05-14
  • 怎么将jquery对象和js对象进行转换
    怎么将jquery对象和js对象进行转换?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。jquery是什么jquery是一个简洁而快速的JavaScript库,它具有独特的链...
    99+
    2023-06-14
  • 怎么在golang中利用Cast组件对类型进行转换
    这篇文章主要为大家详细介绍了怎么在golang中利用Cast组件对类型进行转换,文中示例代码介绍的非常详细,具有一定的参考价值,发现的小伙伴们可以参考一下:什么是golanggolang 是Google开发的一种静态强类型、编译型、并发型,...
    99+
    2023-06-06
  • 怎么在Javascript中将JS对象与JSON进行转换
    今天就跟大家聊聊有关怎么在Javascript中将JS对象与JSON进行转换,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。1.JSON.stringify():js对象->js...
    99+
    2023-06-14
  • golang如何对interface类型进行转换
    这篇文章主要介绍了golang如何对interface类型进行转换的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇golang如何对interface类型进行转换文章都会有所收获,下面我们一起来看看吧。inter...
    99+
    2023-07-05
  • 怎么在python中对capitalize进行转换
    这期内容当中小编将会给大家带来有关怎么在python中对capitalize进行转换,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。1、将字符串的首字母转换为大写。#输入 ["pytho...
    99+
    2023-06-15
  • 怎么将JS对象与jQuery对象进行相互转换
    这篇文章主要介绍了怎么将JS对象与jQuery对象进行相互转换,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。1.jQuery对象转换为JS原生对象<body>&n...
    99+
    2023-06-14
  • PHP中如何进行对象转换
    随着PHP成为现代Web开发的主流语言,越来越多的开发人员开始涉足对象编程。在PHP中,对象是一种非常强大而又常见的数据结构。但是,在实际开发中,我们常常需要将对象转换为字符串或者数组对象,以便进行其他操作。本文将介绍PHP中如何进行对象转...
    99+
    2023-05-14
  • 怎么在python中转换对象
    怎么在python中转换对象?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。python主要应用领域有哪些1、云计算,典型应用OpenStack。2、WEB前端开...
    99+
    2023-06-15
  • JavaScript中怎么将对象转换为原始类型
    这篇文章将为大家详细讲解有关JavaScript中怎么将对象转换为原始类型,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。说明将原始类型的对象转换为内置的[ToPrimitive]函数。使用S...
    99+
    2023-06-20
  • java中实现对类的对象进行排序
    我们需要对类按照类中的某一个属性(或者多个属性)来对类的对象进行排序,有两种方法可以实现,一种方法是类实现Comparable接口,然后调用Collections.sort(List)方法进行排序,另一种方法是类不实现Comparable接...
    99+
    2022-03-08
    java教程 java 实现 对象 排序
  • 在Java项目中如何对进制进行转换
    在Java项目中如何对进制进行转换?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。十进制转成十六进制: Integer.toHexString(int i) 十进...
    99+
    2023-05-31
    java ava 目中
  • 怎么在C语言中对字符串与各数值类型进行转换
    本篇文章给大家分享的是有关怎么在C语言中对字符串与各数值类型进行转换,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。首先放上一段展示各函数使用的代码,大家也可以copy到自己的机...
    99+
    2023-06-14
  • Java中如何实现将xml与对象进行转换
    本篇文章为大家展示了Java中如何实现将xml与对象进行转换,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。xml与Java对象的转换详解1.xstream解析报文XStreamComponent x...
    99+
    2023-05-31
    xml java 对象
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作