java中对象类型转换_Java中的对象的类型转换介绍(附代码)

本篇文章给大家带来的内容是关于Java中的对象的类型转换介绍(附代码),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。

向上转型:子类对象转为父类,父类可以是接口。公式:Father f = new Son();Father是父类或接口,son是子类。

向下转型:父类对象转为子类。公式:Son s = (Son)f;

26e7bb3c42eea12a5b762e72c0e08c04.png

我们将形参设为父类Animal类型,当执行test.f(c)时,内存情况如下图:

62cf8f92b9e645d41b9d2fc178306fbe.png

c作为Cat类型传入,Animal a作为形参,相当于执行了Animal a = new Cat(),这时a和c同时指向Cat对象,但此时a不能访问Cat类扩展的数据成员,所以再将a强转成Cat类型即可。如果不存在这样的转型机制,则针对猫和狗我们还要分别写两个函数f(Cat c)和f(Dog d)。但其实上图程序的可扩展性也不是最好的。我们还可以利用动态绑定(即多态)将扩展性进一步提升。多态机制的三个前提分别是:(1)要有继承,(2)要重写,即子类对父类中某些方法进行重新定义,(3)要向上转型,用父类引用指向子类对象。下面来看一个例子:

class Animal {

private String name;

/**

* 在Animal类自定义的构造方法

* @param name

*/

Animal(String name) {

this.name = name;

}

/**

* 在Animal类里面自定义一个方法enjoy

*/

public void enjoy() {

System.out.println("动物的叫声……");

}

}

class Cat extends Animal {

private String eyesColor;

/**

* 在子类Cat里面定义Cat类的构造方法

* @param n

* @param c

*/

Cat(String n, String c) {

/**

* 在构造方法的实现里面首先使用super调用父类Animal的构造方法Animal(String name)。

* 把子类对象里面的父类对象先造出来。

*/

super(n);

eyesColor = c;

}

/**

* 子类Cat对从父类Animal继承下来的enjoy方法不满意,在这里重写了enjoy方法。

*/

public void enjoy() {

System.out.println("我养的猫高兴地叫了一声……");

}

}

/**

* 子类Dog从父类Animal继承下来,Dog类拥有了Animal类所有的属性和方法。

* @author gacl

*

*/

class Dog extends Animal {

/**

* 在子类Dog里面定义自己的私有成员变量

*/

private String furColor;

/**

* 在子类Dog里面定义Dog类的构造方法

* @param n

* @param c

*/

Dog(String n, String c) {

/**

* 在构造方法的实现里面首先使用super调用父类Animal的构造方法Animal(String name)。

* 把子类对象里面的父类对象先造出来。

*/

super(n);

furColor = c;

}

/**

* 子类Dog对从父类Animal继承下来的enjoy方法不满意,在这里重写了enjoy方法。

*/

public void enjoy() {

System.out.println("我养的狗高兴地叫了一声……");

}

}

/**

* 子类Bird从父类Animal继承下来,Bird类拥有Animal类所有的属性和方法

* @author gacl

*

*/

class Bird extends Animal {

/**

* 在子类Bird里面定义Bird类的构造方法

*/

Bird() {

/**

* 在构造方法的实现里面首先使用super调用父类Animal的构造方法Animal(String name)。

* 把子类对象里面的父类对象先造出来。

*/

super("bird");

}

/**

* 子类Bird对从父类Animal继承下来的enjoy方法不满意,在这里重写了enjoy方法。

*/

public void enjoy() {

System.out.println("我养的鸟高兴地叫了一声……");

}

}

/**

* 定义一个类Lady(女士)

* @author gacl

*

*/

class Lady {

/**

* 定义Lady类的私有成员变量name和pet

*/

private String name;

private Animal pet;

/**

* 在Lady类里面定义自己的构造方法Lady(),

* 这个构造方法有两个参数,分别为String类型的name和Animal类型的pet,

* 这里的第二个参数设置成Animal类型可以给我们的程序带来最大的灵活性,

* 因为作为养宠物来说,可以养猫,养狗,养鸟,只要是你喜欢的都可以养,

* 因此把它设置为父类对象的引用最为灵活。

* 因为这个Animal类型的参数是父类对象的引用类型,因此当我们传参数的时候,

* 可以把这个父类的子类对象传过去,即传Dog、Cat和Bird等都可以。

* @param name

* @param pet

*/

Lady(String name, Animal pet) {

this.name = name;

this.pet = pet;

}

/**

* 在Lady类里面自定义一个方法myPetEnjoy()

* 方法体内是让Lady对象养的宠物自己调用自己的enjoy()方法发出自己的叫声。

*/

public void myPetEnjoy() {

pet.enjoy();

}

}

public class Jerque {

public static void main(String args[]) {

/**

* 在堆内存里面new了一只蓝猫对象出来,这个蓝猫对象里面包含有一个父类对象Animal。

*/

Cat c = new Cat("Catname", "blue");

/**

* 在堆内存里面new了一只黑狗对象出来,这个黑狗对象里面包含有一个父类对象Animal。

*/

Dog d = new Dog("Dogname", "black");

/**

* 在堆内存里面new了一只小鸟对象出来,这个小鸟对象里面包含有一个父类对象Animal。

*/

Bird b = new Bird();

/**

* 在堆内存里面new出来3个小姑娘,名字分别是l1,l2,l3。

* l1养了一只宠物是c(Cat),l2养了一只宠物是d(Dog),l3养了一只宠物是b(Bird)。

* 注意:调用Lady类的构造方法时,传递过来的c,d,b是当成Animal来传递的,

* 因此使用c,d,b这三个引用对象只能访问父类Animal里面的enjoy()方法。

*/

Lady l1 = new Lady("l1", c);

Lady l2 = new Lady("l2", d);

Lady l3 = new Lady("l3", b);

/**

* 这三个小姑娘都调用myPetEnjoy()方法使自己养的宠物高兴地叫起来。

*/

l1.myPetEnjoy();

l2.myPetEnjoy();

l3.myPetEnjoy();

}

}

上面的例子中,我们发现,如果我们想要加入新的动物,只需定义相应的类继承Animal,完全不用动任何一处代码,因为这里运用了面向对象最核心的东西——多态。与之前的例子不同,虽然我们一直强调当用父类的引用指向子类对象,父类无法访问子类自己的成员,但是方法与数据成员不同,具体调哪一个方法是等到运行时决定的,new出了什么对象就调用相应对象的方法,取决于实际new出的对象而不是指向对象的引用,所以当传入不同动物类型,mypetEnjoy()就会去执行不同的方法。

f22f81a2667c76e9641237caa83cbe65.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/566475.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java面板中添加面板_如何把窗体加入面板中 java

展开全部一般来说,我们常把JPanel[面板]放到JFrame窗体中但是也有一种内部窗体JInternalFrame ,可以放到其他的容器JDesktopPane里,效果图e69da5e887aa62616964757a686964616f31333363373731如下代码如下import java.awt.*;import java.awt.event.*;import java.beans.Property…

mysql 如果存在修改_mysql如存在并发修改可能,一定要注意保证数据一致性

近日,因人员调整接手了一个其他部门负责的项目。随后发现其中的很多关键环节是没有考虑mysql并发操作的,现列出存在的一例问题 并分享如何解决的。问题描述:用户账户余额转移赠送 (用户A将自己的账户剩余金额赠送给用户B),同一时刻还可能存在…

微信对账单 java_微信支付对账,你是如何处理的?

支付对账,即检查第三方支付与数据库中账单是否一一对应,涉及到微信对账单的处理,成功时,微信账单接口返回数据以文本表格的方式返回,第一行为表头,后面各行为对应的字段内容,字段内容跟查询订单…

java如何处理灰度图片_Java图片的灰度处理方法

通过看网上各种大牛的总结,和自己亲身测试总结一下Java图片的灰度处理方法(1)我们熟知的图片中的像素点有RGB值。(2)图片灰度化的方式大概分为四种,第一种是最大值法(取颜色RGB中的最大值作为灰度值);第二种是最小值法(取颜色RGB的最小值作为…

java jsp校验提示信息_java Jquery表单校验代码jsp页面

jsp.file欢迎注册EasyMall/* 注册表单的js校验 */var formObj {/* 检查输入项是否为空 */"checkNull" : function(name, msg){var value $("input[name"name"]").val().trim();//清空之前的提示消息formObj.setMsg(name, "");if(val…

错误处理方法 java_JAVA常见错误处理方法 和 JVM内存结构

OutOfMemoryError在开发过程中是司空见惯的,遇到这个错误,新手程序员都知道从两个方面入手来解决:一是排查程序是否有BUG导致内存泄漏;二是调整JVM启动参数增大内存。OutOfMemoryError有好几种情况,每次遇到这个错误时…

java中如何分隔字符串_Java中分割字符串

java.lang.String的split()方法, JDK 1.4 or laterpublic String[] split(String regex,int limit)示例代码public classStringSplit {public static voidmain(String[] args) {String sourceStr "1,2,3,4,5";String[] sourceStrArray sourceStr.split(",&quo…

php测试号推送消息失败,信息发送失败是什么原因

手机突然信息发送失败可能是以下原因:1.是因为我们的手机出现了欠费的情况,所以发不出短信,这种情况是最为普遍的,需要我们及时的进行缴费。2.手机的信息中心的号码设置有误,应该根据你所在省份的实际信息中心号码进行设置,这样一般就能解决这方面的问题。可能是你的…

php ajax 概率 转盘,php+jquery实现转盘抽奖 概率可任意调

phpjquery实现转盘抽奖 概率可任意调phpjquery实现转盘抽奖 概率可任意调Posted by: xiaomiao 2014/05/13in Code, PHP 3 Commentsphpjquery实现转盘抽奖查看DEMO演示转盘抽奖,炫丽的一般是flash做的。不懂flash而又不需要那么炫丽,可以简单的通过jquer…

php自动抓取文章图片,从文章中提取图片,把图片保存到本地,自动提取缩略图...

开发二代旅游网站程序和CMS的时候,有一个需求,就是从网上复制的内容,里面包含图片的,需要对把图片提取出来,并且保存到本地,并且把图片的URL地址本地化,以下是实现的代码。开发二代旅游网站程序…

简单的php探针,php探针程序的推荐

在我们之前的文章已经为大家介绍了什么是php探针,以及他的主要作用是什么,如果你接触了cms或许就会有点了解,当然,不要紧,看完这篇就知道php探针是做什么的了。php探针通常是用来探测空间、服务器运行的状况和php相关信…

php熊掌号怎么设置json-ld,dedecms织梦系统对接百度熊掌号并添加JSON_LD数据

百度近期推出的百度熊掌号非常的不错,我的dedecms织梦系统早早就对接好了,它能对你的原创文章进行原创保护,并评出熊掌号搜索指数,熊掌号搜索指数是对你文章的内容质量,用户喜爱、原创能力、活跃表现、领域专注五个维度进行计算评估而得到的。你的dedecms织梦网站开通熊掌号之后…

php获取信息,PHP文件信息获取函数

知识点:basename():获取文件名,传入第二个参数则只显示文件名,不显示后缀dirname():获取文件路径pathinfo():将文件信息存入一个数组,通过索引basename,dirname,extension可以获得对应的文件名,…

mysql pdo 查询一条数据,使用 PDO 关联查询 MySQL 数据

使用pdo关联查询mysql数据try {$pdo new PDO(mysql:hostlocalhost;dbnametest;, root, 123456);// 0.等值联结$sql SELECT c.name, o.id, o.customer_id, o.price FROM orders o, customer c WHERE o.customer_id c.id AND c.name :name;// 1.内联结(与上面等值联结返回的查…

mysql 数据类型怎么用,myMySQL数据库怎么更改表中某字段的数据类型? MySQL数据库使用教程...

在mysql中,可以使用“ALTER TABLE”语句配合“MODIFY”关键字来更改表中某字段的数据类型;语法格式“ALTER TABLE MODIFY ”。(推荐教程:mysql视频教程)在 MySQL 中,ALTER TABLE 语句可以改变原有表的结构,例如增加或删…

matlab multithreading spyder,spyder和python的关系是什么

版权所有:http://wWw.pxcodeS.comspyder和python的关系:1、Spyder是Python的一个简单的集成开发环境;2、它和其他的Python开发环境相比**大的优点就是模仿MATLAB的“工作空间”的功能,可以很方便地观察和修改数组的值。LHF少儿编程…

python私有成员和保护成员,喜大普奔!Maya 2022来了?!

距离Maya 2020第一个版本发布已经过去将近1年半。各位用户苦等Maya 2021的发布,不料2021没等到,而Maya 2022要来了?!这两天小编刷Maya官网,在帮助页面竟然看到官方放出了“Maya 2022 新特性”的页面!吓得小…

php web教程视频教程下载,Web全栈 PHP+React系列视频教程下载

Web全栈 PHPReact系列视频教程下载课程介绍:此套Web全栈 PHPReact系列视频教程覆盖PHP、前端和区块链应用开发三大热门职位,教程对网络基础、前端基础(HTML CSSJavaScriptjQuery)、网站基础、PHP、React、区块链等均做了详细的讲解,无源码。Web全栈 PHPR…

mac怎么配置php开发环境变量,Mac M1安装mnmp(Mac+Nginx+MySQL+PHP)开发环境

之前刚装好了 HomeBrew ,接下来就要安装 环境了。注意:如果 brew install 出以下错误, 则安装时使用arch -arm64 brew install软件包名 进行安装安装 Nginxbrew install nginx安装成功后,通过 brew info nginx ,查看 nginx 信息,最主要是看 网…

php5 dm.dll,win10模块dll加载失败二进制怎么解决?

首先使用【WinR】,打开运行窗口,输入“Powershell”,并回车;然后在打开的Powershell管理器中,输入“Get-AppXPackage -AllUsers | Foreach {....}”命令;最后等待系统自行处理即可解决方法:1、我…