Java深入讲解instanceof关键字的使用

 更新时间:2022年05月30日 08:38:53   作者:小老师ir  
instanceof 是 Java 的一个二元操作符,类似于 ==,>,< 等操作符。instanceof 是 Java 的保留关键字。它的作用是测试它左边的对象是否是它右边的类的实例,返回 boolean 的数据类型

instanceof关键字的使用

1. 语法格式

x instanceof A:检验x是否为类A的对象,返回值为boolean类型,如果是,返回true;如果不是,返回false。

⭕ 要求x所属的类与类A必须是子类和父类的关系,否则编译错误

⭕ 如果x属于类A的子类B,x instanceof A值也为true

public class Person extends Object {…}
public class Student extends Person {…}
public class Graduate extends Person {…}
-------------------------------------------------------------------
public void method1(Person e) {
   if (e instanceof Person) {// 处理Person类及其子类对象}   
   if (e instanceof Student) {//处理Student类及其子类对象}
   if (e instanceof Graduate){//处理Graduate类及其子类对象}
}

2. 类型转换 (Casting)

2.1 基本数据类型的Casting

⭕ 自动类型转换:小的数据类型可以自动转换成大的数据类型。

如:long g=20; double d=12.0f;

⭕ 强制类型转换:可以把大的数据类型强制转换(casting)成小的数据类型。

如:float f=(float)12.0; int a=(int)1200L;

2.2 对象类型转换

⭕ 为了避免在向下转型时出现ClassCastException的异常,我们在向下转型之前,先进行instanceof的判断,一旦返回true,就进行向下转型。如果返回false,不进行向下转型。

⭕ 从子类到父类的类型转换可以自动进行 。

⭕ 从父类到子类的类型转换必须通过造型(强制类型转换)实现 。

⭕ 无继承关系的引用类型间的转换是非法的。

⭕ 如果 a instanceof A返回true,则 a instanceof B也返回true, 其中,类B是类A的父类。

2.3 代码演示

public class ConversionTest {
   public static void main(String[] args) {
     double d = 13.4;
     long l = (long) d;
     System.out.println(l);//13
     int in = 5;
     // boolean b = (boolean)in;
     Object obj = "Hello";
     String objStr = (String) obj;
     System.out.println(objStr);//Hello
     Object objPri = new Integer(5);
     // 所以下面代码运行时引发ClassCastException异常
    String str = (String) objPri; 
    /*
    Exception in thread "main" java.lang.ClassCastException:          
    java.lang.Integer cannot be cast to java.lang.String
    */
    } 
}

3. 错误举例

class Person {
	String name;
	int age;	
	int id = 1001;	
	public void eat(){
		System.out.println("人:吃饭");
	}	
	public void walk(){
		System.out.println("人:走路");
	}	
}
class Man extends Person{	
	boolean isSmoking;	
	int id = 1002;	
	public void earnMoney(){
		System.out.println("男人负责挣钱养家");
	}	
	public void eat(){
		System.out.println("男人多吃肉,长肌肉");
	}	
	public void walk(){
		System.out.println("男人霸气的走路");
	}
}
class Woman extends Person{	
	boolean isBeauty;	
	public void goShopping(){
		System.out.println("女人喜欢购物");
	}	
	public void eat(){
		System.out.println("女人少吃,为了减肥");
	}	
	public void walk(){
		System.out.println("女人窈窕的走路");
	}
}
public class PersonTest {
	public static void main(String[] args) {
//问题一:编译时通过,运行时不通过
		//举例一:
//		Person p3 = new Woman();
//		Man m3 = (Man)p3;
		//举例二:
//		Person p4 = new Person();
//		Man m4 = (Man)p4;
		//问题二:编译通过,运行时也通过
//		Object obj = new Woman();
//		Person p = (Person)obj;
		//问题三:编译不通过
//		Man m5 = new Woman();		
//		String str = new Date();		
//		Object o = new Date();
//		String str1 = (String)o;
	}
}

到此这篇关于Java深入讲解instanceof关键字的使用的文章就介绍到这了,更多相关Java instanceof内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 解决maven打包失败:程序包xxxx不存在问题

    解决maven打包失败:程序包xxxx不存在问题

    这篇文章主要介绍了解决maven打包失败:程序包xxxx不存在问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-03-03
  • Java中Executor和Executors的区别小结

    Java中Executor和Executors的区别小结

    在Java并发编程中,Executor是一个核心接口,提供了任务执行的抽象方法,而Executors是一个工具类,提供了创建各种线程池的工厂方法,Executor关注任务的执行,而Executors关注如何创建适合的执行器,感兴趣的可以了解一下
    2024-10-10
  • IntelliJ Idea 2020.1 正式发布,官方支持中文(必看)

    IntelliJ Idea 2020.1 正式发布,官方支持中文(必看)

    这篇文章主要介绍了IntelliJ Idea 2020.1 正式发布,官方支持中文了,本文通过截图的形式给大家展示,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-04-04
  • idea文件上有锁文件只读不可编辑的解决

    idea文件上有锁文件只读不可编辑的解决

    这篇文章主要介绍了idea文件上有锁文件只读不可编辑的解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-12-12
  • 详解SpringBoot 应用如何提高服务吞吐量

    详解SpringBoot 应用如何提高服务吞吐量

    这篇文章主要介绍了Spring Boot 应用如何提高服务吞吐量,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-07-07
  • SpringCloud如何使用Eureka实现服务之间的传递数据

    SpringCloud如何使用Eureka实现服务之间的传递数据

    这篇文章主要介绍了SpringCloud使用Eureka实现服务之间的传递数据操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-06-06
  • Java类的初始化顺序的实现

    Java类的初始化顺序的实现

    类的初始化过程是在类加载阶段完成的,包括加载、验证、准备、解析和初始化等步骤,本文主要介绍了Java类的初始化顺序的实现,感兴趣的可以了解一下
    2023-12-12
  • 一文带你厉害Java设计模式中的模板方法

    一文带你厉害Java设计模式中的模板方法

    模板方法定义了一个算法的步骤,并允许子类为一个或多个步骤提供实现。这篇文章就来带大家了解一下Java模板方法的概念与实现,感兴趣的小伙伴可以跟随小编一起学习一下
    2023-01-01
  • springboot中如何替换class文件

    springboot中如何替换class文件

    这篇文章主要介绍了springboot中如何替换class文件,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-02-02
  • 详解Java引用类型的参数也是值传递

    详解Java引用类型的参数也是值传递

    这篇文章主要介绍了Java引用类型的参数也是值传递,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-03-03

最新评论