博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java中的向下与向上转型
阅读量:4128 次
发布时间:2019-05-25

本文共 2735 字,大约阅读时间需要 9 分钟。

Java中的向下与向上转型

1.向上转型

向上转型就是子类的对象赋给父类的引用或(父类的引用指向子类的对象)。例如人和男人的关系,男人属于人,人不仅仅只包含男人,还包含女人。

举例:
父类

class Person {
public void eat(){
System.out.println("吃饭"); } public void sleep(){
System.out.println("睡觉"); }}

子类:

class Woman extends Person{
public void eat(){
System.out.println("女人少吃饭"); } public void work(){
System.out.println("女人负责貌美如花"); }}class Man extends Person{
public void eat(){
System.out.println("男人多吃饭"); } public void work(){
System.out.println("男人负责赚钱养家"); }}

测试类(向上转型):

public class TestDemo{
public static void main(String[] args) {
System.out.println("Person父类*************"); Person p=new Person(); p.eat(); p.sleep(); System.out.println("向上转型****************"); //向上转型(多态)子类的对象赋给父类的引用(父类的引用指向子类的对象) Person p1=new Man();//向上转型 p1.eat();//当调用子父类同名同参数的方法时,实际执行的是子类重写父类的方法 ---虚拟方法调用 //p1.work; // 有了对象的多态性以后,内存中实际上是加载了子类特有的属性和方法的,但是由于变量声明为父类类型 //编译时,只能调用父类中声明的属性和方法。子类特有的属性和方法不能调用。 }}

2.向下转型

  • 向上转型无法调用子类特有的属性和方法,为了能够调用子类特有的属性和方法,就有了向下转型。向下转型是子类对象被父类引用之后,再把父类引用强转成子类,强转时叫做向下转型。
  • 使用强转时,可能出现ClassCastException的异常。会用到instanceof关键字。

instanceof关键字的使用

  • 为了避免在向下转型时出现ClassCastException的异常,我们在向下转型之前,先进行instanceof的判断,一旦返回true,就进行向下转型。如果返回false,不进行向下转型。
  • 使用格式:
a instanceof A:判断对象a是否是类A的实例。如果是,返回true;如果不是,返回false。注意:如果 a instanceof A返回true,则 a instanceof B也返回true.其中,类B是类A的父类。

举例:

测试类(向下转型)及instanceof关键字的使用:

public class TestDemo{
public static void main(String[] args) {
System.out.println("Person父类*************\t"); Person p=new Person(); p.eat(); p.sleep(); System.out.println("向上转型****************\t"); //向上转型(多态)子类的对象赋给父类的引用(父类的引用指向子类的对象) Person p1=new Man();//向上转型 p1.eat();//当调用子父类同名同参数的方法时,实际执行的是子类重写父类的方法 ---虚拟方法调用 //p1.work; // 有了对象的多态性以后,内存中实际上是加载了子类特有的属性和方法的,但是由于变量声明为父类类型 //编译时,只能调用父类中声明的属性和方法。子类特有的属性和方法不能调用。 System.out.println("向下转型****************\t"); //向下转型:子类对象被父类引用之后,再把父类引用强转成子类,强转时叫做向下转型。 Man m=(Man)p1;//向下桩型 m.work(); m.eat(); System.out.println("instanceof关键字使用******\t"); if(p1 instanceof Woman){
Woman w1 = (Woman)p1; w1.work(); System.out.println("******Woman******"); } if(p1 instanceof Man){
Man m2 = (Man)p1; m2.work(); System.out.println("******Man******"); } if(p1 instanceof Person){
System.out.println("******Person******"); } if(p1 instanceof Object){
System.out.println("******Object******"); } }}

转载地址:http://xerpi.baihongyu.com/

你可能感兴趣的文章
springmvc传值
查看>>
Java 集合学习一 HashSet
查看>>
在Eclipse中查看Android源码
查看>>
Android使用webservice客户端实例
查看>>
层在页面中的定位
查看>>
[转]C语言printf
查看>>
C 语言 学习---获取文本框内容及字符串拼接
查看>>
C 语言学习 --设置文本框内容及进制转换
查看>>
C 语言 学习---判断文本框取得的数是否是整数
查看>>
C 语言 学习---ComboBox相关、简单计算器
查看>>
C 语言 学习---ComboBox相关、简易“假”管理系统
查看>>
C 语言 学习---回调、时间定时更新程序
查看>>
C 语言 学习---复选框及列表框的使用
查看>>
第四章 - 程序计数器
查看>>
第七章 - 本地方法栈
查看>>
第十一章 - 直接内存
查看>>
JDBC核心技术 - 上篇
查看>>
一篇搞懂Java反射机制
查看>>
ThreadLocal
查看>>
从Executor接口设计看设计模式之最少知识法则
查看>>