Java 面向对象:instanceof和类型转换的理解

一、instanceof

1.定义:

instanceof A 判断一个引用所指向的对象,是否是A类型,或者A的子类

instanceof 的格式:
变量名 instanceof 数据类型,能不能编译通过是取决于,变量"指向的类型"和"数据类型"是否存在父子关系,如果存在父子关系则编译通过

换言之:X instanceof Y ,变量X指向的类型如果是Y的子类型则编译通过

instanceof 的使用
如果变量属于该数据类型,返回true。
如果变量不属于该数据类型,返回false。

所以,转换前,我们最好使用instanceof 先做一个判断

2. 实例

Person类(父类)

package Day0204.Demo03;public class Person {}

Student类(子类)继承Person类

package Day0204.Demo03;public class Student extends Person{}

Teacher类(子类)继承Person类

package Day0204.Demo03;public class Teacher extends Person{}

测试类

package Day0204.Demo03;
public class Test {public static void main(String[] args) {//Object > Person > Teacher//Object > String//Object > Person > StudentObject o = new Student();System.out.println(o instanceof Student);//trueSystem.out.println(o instanceof Person);//trueSystem.out.println(o instanceof Teacher);//falseSystem.out.println(o instanceof String);//falseSystem.out.println("======================");//Person > Teacher//String//Person > StudentPerson p = new Student();System.out.println(p instanceof Student);//trueSystem.out.println(p instanceof Person);//trueSystem.out.println(p instanceof Teacher);//false
//        System.out.println(p instanceof String);//编译不通过System.out.println("======================");Student s = new Student();System.out.println(s instanceof Student);//trueSystem.out.println(s instanceof Person);//true
//        System.out.println(s instanceof Teacher);//编译不通过
//        System.out.println(p instanceof String);//编译不通过}
}

类之间的继承关系:
Object > Person > Teacher
Object > String
Object > Person > Student

变量o指向的是Student类型,
Student类是Person类和Object类的子类,与String类、Teacher类无关
所以前两个输出结果为true,而后两个为false

Object o = new Student();System.out.println(o instanceof Student);//trueSystem.out.println(o instanceof Person);//trueSystem.out.println(o instanceof Teacher);//falseSystem.out.println(o instanceof String);//false

以此类推

二、类型转换

1. 向上转型

向上转型:多态本身是子类类型向父类类型向上转换的过程,其中,这个过程是默认的。你可以把这个过程理解为基本类型的小类型转大类型自动转换,不需要强制转换。

当父类引用指向一个子类对象时,便是向上转型。

向上转型格式:

父类类型 变量名 = new 子类类型(); 如:Father f= new Son();

2.向下转型

向下转型:父类类型向子类类型向下转换的过程,这个过程是强制的。同样可以把这个过程理解为基本类型的自动转换,大类型转小类型需要强制转换。一个已经向上转型的子类对象,将父类引用转为子类引用,可以使用强制类型转换的格式,向下转使用格式:

Father father = new Son();
子类类型 变量名 = (子类类型) 父类变量名; 如:Son s =(Son) father;

划重点:向下转型的前提是父类对象指向的是子类对象(也就是说,在向下转型之前,它得先向上转型)

  • 向下转型的意义:
    想要调用子类特有的方法,必须做向下转型。

参考宜春的“深入理解java多态没有烤山药的存在,java就不香了吗?”

以及【狂神说Java】Java零基础学习视频通俗易懂

Java 面向对象:instanceof和类型转换的理解相关推荐

  1. Java 面向对象:super关键字的理解

    Java 面向对象:super关键字的理解 一.Super关键字: 1. super调用父类的构造方法,必须在构造方法的第一个 2. super只能出现在子类的方法或构造方法中! 3. super和t ...

  2. 对java面向对象的三大特征的理解_Java面向对象的三大特征是什么?

    面向对象的三大核心特性简介 面向对象开发模式更有利于人们开拓思维,在具体的开发过程中便于程序的划分,方便程序员分工合作,提高开发效率. 该开发模式之所以使程序设计更加完善和强大,主要是因为面向对象具有 ...

  3. JAVA面向对象-----instanceof 关键字

    instanceof 关键字 1:快速演示instanceof Person p=new Person();System.out.println( p instanceof Person); 2:in ...

  4. java面向对象基本特征_Java 面向对象的基本特征

    前言: 在刚开始接触Java的时候,那时候面对Java面向对象的几大特征一直理解的不是很理解,借着空闲时间在这里整理一下,同时在加深一下印象. 一.封装: Java面向对象的特征之封装,所谓的封装就是 ...

  5. Day16-01 P71 面向对象12什么是多态 P72 对象13:instanceof和类型转换 P73 static关键字详解 P74 抽象类 P75 接口的定义与实现 P76N种内部类

    Day16-01 P71 面向对象12:什么是多态 //父类Person package com.oop.demo06;public class Person {public void run(){S ...

  6. 【从零开始的Java开发】1-4-3 多态:概念、实现、向上转型、向下转型、instanceof、类型转换、抽象类、抽象方法

    文章目录 概念 程序中的继承的实现 向上转型 向下转型 instanceof 运算符 类型转换案例 需求1 需求2 总结 抽象 抽象类 抽象方法 总结 总结 多态,即多种形态.我们可以认为,封装和继承 ...

  7. Java强制类型转换的理解

    在Java中的强制类型转换和C语言中还是有一些区别的; 进行类型转换的唯一原因是: 在暂时忽视对象的实际类型之后, 使用对象的全部功能. 比如,我们可以定义一个父类的对象,然后引用某一个子类的对象,但 ...

  8. Java SE_封装、继承、object类、super-this关键字、方法重写、多态、instanceof、类型转换

    封装 该露的露,该藏的藏 我们程序设计要追求"高内聚,低耦合".高内聚:类的内部数据操作细节自己完成,不允许外部干涉:低耦合:仅暴露少量的方法给外部使用. 封装(数据的隐藏) 通常 ...

  9. java 面向对象个人理解

    1.java面向对象我的理解是:一个系统可以看做一个对象,例如能耗监测系统,我需要监测能耗时,我只要用这个系统就可以了,他内部怎么实现的我不用去管. 2.举个例子:例如一个人是一个对象,可以用属性描述 ...

最新文章

  1. 如何挑选一家好的软件测试培训机构
  2. HRFormer,内存和参数降低40%
  3. 开发日记-20190609 关键词 记录一次失败,感悟,畅想未来
  4. java查询数据库以后的对齐问题
  5. 博士申请 | 英国爱丁堡大学NLP组招收自然语言处理方向全奖博士生
  6. 【算法】输入一个链表,反转链表后,输出新链表的表头。
  7. Liunx下使用Nginx负载均衡
  8. aes密文长度_RSA加密密文可变(一句话说明)
  9. 杂记 C中的volatile
  10. 演示和解析Flex布局中的各种属性
  11. Linux input输入子系统demo驱动
  12. 计算机模拟 matlab,MATLAB计算机模拟实例课件.ppt
  13. php 冗余代码检测,冗余代码检查工具Simian | 求索阁
  14. 阿拉伯数字转化成大写金额
  15. PADS 导入cadence dsn文件,同步pads layout
  16. 教你微星电脑按f几重装系统
  17. 向NS2中添加协议PING
  18. 例题 9-8 颜色的长度(Color Length, ACM/ICPC Daejeon 2011, UVa1625)
  19. 基于模型的设计及其嵌入式实现(无水印).pdf_DeepMind打造最强表示学习模型BigBiGAN,Goodfellow点赞!...
  20. CSS3计数器的使用-遁地龙卷风

热门文章

  1. C#学习(6)——LINQ学习
  2. [转] ASP.NET中使用javascript
  3. JavaScript let、const与var的区别
  4. CSS3 移动端开发技巧
  5. jQuery源码研究分析学习笔记-回调函数(11)
  6. WIN10+VS2015环境下安装PCL1.8.1
  7. 元气骑士超级计算机有什么用,元气骑士三持技巧分享,手残党的福利轻松过关...
  8. Prototype(原型原型链)
  9. 4010-基于邻接矩阵的边的删除(C++,附思路)
  10. js list操作_使用 Node.js 实现一个命令行 todo-list(1)- 基本功能