继承是Java中常用的一项特性,通过继承我们可以省去很多麻烦。

而Java中超类和子类对象之间的转换则是很多新手的常遇见的难题,要是处理不好,恐怕会因为这个很特殊的问题导致一些潜在的危险,让你整整一个晚上都在调试程序以解决一个让人抓狂的java.lang.ArrayStoreException异常。

哈哈,所谓救人一bug胜造七级浮屠,今天我们就来理一理Java中超类和子类对象之间的转换,看看它到底有什么不一样!

首先我们要了解一下转换的概念。

从子类向父类的转换称为向上转换(upcasting),通过向上转换,我们能够在编写程序时采用通用程序设计的思想,在需要使用子类对象的时候,通过把变量定义为父类型,我们可以通过一个变量,使用该父类型的所有子类型实例;从父类型向子类型的转换称为向下转换(downcasting),通过向下转换,我们能在必要的时候,将父类型变量转换成子类型变量,使用一些通过子类型才能够使用的方法。

那什么时候可以进行转换呢?

我们先来说一说向上转换,这个比较简单,而且限制还少。

还是老规矩,我们下面来看一段代码~~

来呀!!阿福,放代码~~~

class  Father

{

};

class Son extends  publc  Father

{

};

在上面的程序中Father为超类,son是father的子类

那如何将子类转换为超类呢?

Father  f  =   new  Son();  //父类引用指向子类对象

显然,这样就可以了。需要注意,new  Son()表示在在堆中分配了一段空间来存放类Son中的数据,并返回一个Son的对象,并赋值给Father的引用f,即f指向子类的对象,此时,子类的对象并没有定义一个名字。

也就是说上面的语句等价于:

Son  s  =   new  Son();

Father  f  =  s;

注:父类不可调用子类新增的方法,即f不可调用s新增的方法。

好啦,子类转父类就是这样简单,接下来该重点看看父类转子类啦。

按理论上分析的话,父类转子类是不可以实现的。因为子类继承于父类,并新增了一些父类并没有的东西,也就是说,子类对象一般都比父类对象包含更多的东西。这样的话,子类如果访问子类新增的内容, 而这些内容父类并没有,所以就会报错。

那Java里面父类到底可不可以转子类呢?

可以!但是需要满足一个前提,即该父类对象已经指向了子类对象。

如:

Father  f  =   new  Son();  //父类引用指向子类对象

Son   s2  =  (Son)f;  //可以

因为当子类强制转换为父类对象时,并没有实际丢失它原有内存空间(比父类多的那些部分)

只是暂时不可访问,所以能再转回来。

此外,当该父类是调用子类构造器创建的时候,它也可以转换为子类。

如:

Employee b=new Manager("a",1000,2,1,225);//父类调用子类的构造器 创建了一个父类对象

这个原理其实和上面的情况一样,因为它也是父类引用指向了子类对象,因此也可以进行转换。

当然,为了防止报ClassCastExcept异常,一般可以在前面加一条判断句 if(father instanceof Son);

如:

Father  f  =   new  Son();  //父类引用指向子类对象

if(father instanceof Son)

{

Son   s2  =  (Son)f;

}

这样就可以避免出错。

通过上文的了解,大家可能心里已经有了一些理解,最后再提一下对象在继承关系中的改变

对象的赋值是地址标识的传递,即两个对象名共同使用同一段内存地址。在Java中,对父类与子类对象之间的赋值作了如下规定:

1、子类对象名可以赋值给父类对象名;但父类对象名不可以赋值给子类对象名。

即:父类对象名=子类对象名;

2、如果一个父类对象名已经被子类对象名所赋值,那可以将父类对象名经强制转换赋值给子类对象名。

即:子类对象名=(子类类名)父类对象名;

常用的一种形式:方法中形参用父类型,实参用子类的对象名.

总结

对类进行造型转换的应参考以下原则:

1.总是可以“父=子”赋值。此时不需要类型转换。

2.可以执行类型转换“子=(子)父”,但需要运行时进行检查。如果父类变量引用的是正确的子类型,赋值将执行。如果父类变量引用的是不相关的子类型,将会生成class castException异常。

即:如果父类的实例是在子类的实例上塑造的,“子=(子)父”时就不会抛出异常。

如:

A 是B的父类。

A a= new B(); //父类A的对象a是在子类B的对象上塑造的。

就可以:

B b= (B)a;

3.决不能在不相关的任何类之间执行类的赋值或者类型转换。即类的造型转换仅限于有继承关系的俩个类的对象之间。

好啦,如果大家还是不太明白,可以试一试下面的程序,亲自上手试一试会了解得更透彻一些。

package inheritance;

public class test {

public static void main(String[] args) {

// TODO Auto-generated method stub

Employee e;

Manager boss =new Manager("Searchin",52000,2018,10,25);

Employee[] staff=new Employee[3];

staff[0]=boss;//子类转父类

Employee b=new Manager("a",1000,2,1,225);//父类调用子类的构造器 创建了一个父类对象

//Manager b=new Employee("a",1000,2,1,225);

Manager a=(Manager)staff[0];//强制类型转换

System.out.println(staff[0].getName());

System.out.println(a.getName());

boss.setBonus(5000);

//staff[0].setBonus(5000);

}

}

package inheritance;

import java.time.*;

public class Employee

{

private String name;

private double salary;

private LocalDate hireDay;

public Employee(String name, double salary, int year, int month, int day)

{

this.name = name;

this.salary = salary;

hireDay = LocalDate.of(year, month, day);

}

public String getName()

{

return name;

}

public double getSalary()

{

return salary;

}

public LocalDate getHireDay()

{

return hireDay;

}

public void raiseSalary(double byPercent)

{

double raise = salary * byPercent / 100;

salary += raise;

}

}

package inheritance;

public class Manager extends Employee

{

private double bonus;

public Manager(String name, double salary, int year, int month, int day)

{

super(name, salary, year, month, day);

bonus = 0;

}

public double getSalary()

{

double baseSalary = super.getSalary();

return baseSalary + bonus;

}

public void setBonus(double b)

{

bonus = b;

}

}

java超类_Java——超类和子类对象之间的转换相关推荐

  1. 学习-Java继承和多态之子类对象特点

    第1关:学习-Java继承和多态之子类对象特点 任务描述 相关知识 子类对象的特点 instanceof 运算符 编程要求 测试说明 任务描述 本关任务:使用 instanceof 运算符判断所指对象 ...

  2. 父类指针指向子类对象的问题、父类对象和子类对象之间的问题

    一.父类指针指向子类对象 先上代码: class Base {public:void base_fun1() {}virtual void base_fun2() {cout << &qu ...

  3. java多态父类引用指向子类对象为什么不能调用子类特有的方法?

    java多态父类引用指向子类对象为什么不能调用子类特有的方法? 我们在学习java面向对象时都会发现当父类引用指向子类对象不能调用子类特有的方法 首先我们需要了解一下java多态的具体体现 1.一个对 ...

  4. 遇到MapStruct后,再也不手写PO,DTO,VO对象之间的转换了

    点击上方 好好学java ,选择 星标 公众号 重磅资讯.干货,第一时间送达 今日推荐:腾讯推出高性能 RPC 开发框架 个人原创100W+访问量博客:点击前往,查看更多 介绍 在工作中,我们经常要进 ...

  5. JSON字符串和对象之间的转换

    使用jackSON来实现JSON字符串和对象之间的转换 引入maven <!--jackson--><dependency><groupId>com.fasterx ...

  6. C#中JSON和对象之间互相转换功能示例

    本文实例讲述了C#实现JSON和对象之间互相转换功能.分享给大家供大家参考,具体如下: 1.首先是声明用户信息对象,DataContract修饰类,表示可以被解析成JSON,DataMember修饰属 ...

  7. Python:json数据与Python对象之间的转换

    json数据与Python对象之间的转换 1.前面介绍了在Python中如何处理json数据,主要使用了以下几个方法     ⑴dumps():将Python对象转换为JSON格式的字符串     ⑵ ...

  8. java超类_java超类

    this是java使用的一个特定意义的引用,它指向当前对象自身.(指向该关键词所在的类,,用来引用自己所在的类中的成员变量或方法.) super关键词指向该关键词所在类的父类,用来引用父类中的成员变量 ...

  9. 开课吧课堂:超类变量如何引用子类对象?

    超类的一个引用变量可以被任何从该超类派生的子类的引用赋值.你将发现继承的这个方面在很多条件下是很有用的.例如,考虑下面的程序: class RefDemo { public static void m ...

  10. java两个对象赋值_一起学Java(二十六)----- 对象之间赋值

    不积跬步,无以至千里:不积小流,无以成江海. Java语言基础 Java对象之间赋值 赋值是用等号运算符" = "进行的,在对对象进行"赋值"时,实际就是将句柄 ...

最新文章

  1. 【BZOJ4282】慎二的随机数列 乱搞
  2. 组合数学实验——二分图匹配算法
  3. 系统运维手册_如何摆脱“背锅侠”,做一个合格的IT运维人员
  4. Freemarker介绍
  5. Java中几种日期格式相互转换
  6. springboot超详细教程_超详细便当袋教程 || 特殊时期,自己带饭最安心!
  7. 计算机路表配置命令,计算机、华为交换机、路由器配置命令表
  8. trang.jar转换xml到Javabean
  9. pku 1463 Strategic game 树形DP
  10. 6 岁就成“大厂团宠”,这门编程语言竟引 Linux、谷歌、亚马逊共“折腰” !
  11. Splice Beatmaker for Mac(音乐节拍工具)
  12. Centos安装交叉编译工具链
  13. 传智播客总裁黎活明“传智专修学院成立暨揭牌仪式”演讲实录
  14. 安卓手机虚拟键盘定位position:fixed问题
  15. 线性非齐次微分方程的求解套路
  16. 直流电机控制与TB6612FNG驱动芯片
  17. 光脚丫学ASP.NET MVC(0006):操作方法概述
  18. 完美解决windows10系统磁盘占用100%并出现卡顿、假死无反应
  19. 利用ArcGIS做一张土地利用现状图
  20. PPTX机械危害预防手册(45页)(附下载)

热门文章

  1. WebUploader 设置单个图片上传
  2. 公司计算机程序员英语怎么说,计算机程序员英文求职信范文模板
  3. 《山海经》异兽75种,附图
  4. 手把手教使用阿里云短信接口发送短信验证码
  5. 支付宝第三方登录集成文档
  6. 如何应对项目需求变更?
  7. 问卷星刷问卷(一)xpath使用
  8. win10查看激活时间(Win10查看激活信息)
  9. python把英语句子成分字母_英语句子成分分析报告(最完整版)
  10. 转换到coff期间_fatal error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏 | Lellansin's 冰森...