Java之instanceof

本文通过一个具体的Java示例介绍了instanceof运算符的使用方法,演示了如何检查一个对象是否为特定类的实例或者其父类的实例,并展示了如何在实际编程中运用这一特性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

instanceof 运算符         判断该对象是否是某一个类的实例

语法格式                 boolean  b = 对象 A  instanceof 类B ;//判断A对象是否是B类的实例,如果是,返回true

instanceof 运算符

若对象是类的实例返回true

若对象是类的父类的实例也返回true

//父类
class Person
{
	String name;
	int age;
	public void work()
	{
		System.out.println("不知道工作干什么");
	}
}
//子类Student
class Student extends Person
{
	public void work()
	{
		System.out.println("我的工作就是上课认真听讲老师");
	}
}
class Teacher extends Person
{
	public void work()
	{
		System.out.println("我的工作就是认真给同学讲课");
	}
}

class Combine
{
	public void work(Person p)
	{
		if(p instanceof Student)
		{
			Student stu = new Student();
			stu.work();
		}
		else
		{
			Teacher tea = new Teacher();
			tea.work();
		}
	}
}
public class Demo {

	public static void main(String[] args) {
		
		//创建学生对象
		Person p = new Student();
		Combine com = new Combine();
		com.work(p);
		p = new Teacher();
		com.work(p);
		
	}
}


<think>首先,用户的问题是:“请问Java 21 instanceof pattern matching example”,翻译成中文是:“请问Java 21 instanceof模式匹配的示例”。用户想了解Java 21中instanceof模式匹配的示例。 根据系统指令,我需要: - 使用中文回答。 - 结构清晰,帮助用户逐步解决问题。 - 保证回答真实可靠。 - 在行内数学表达式使用$...$格式,但在这个问题中没有数学内容,所以可能不适用。 - 独立公式使用$$...$$格式,但这里没有公式。 - LaTeX语法正确。 - 生成相关问题。 - 在回答中引用的段落末尾添加引用标识,如[^1]。 参考提供的引用: - 引用[1]:提到Java 16中引入的Pattern Matching改进instanceof。 - 引用[2]:类似地讨论instanceof的模式匹配。 - 引用[3]:讨论Java 17的模式匹配,包括instanceof的示例。 - 引用[4]:提到Java 21中switch语句的增强,但用户的问题是针对instanceof的。 用户意图是了解Java 21中instanceof的模式匹配示例。从引用中,我知道instanceof的模式匹配是在Java 16中引入的预览特性,并在Java 17中稳定下来。Java 21可能没有对instanceof本身有重大改变,但它是稳定特性。 关键点: - 在Java 16中,instanceof模式匹配成为预览特性。 - 在Java 17中,它成为标准特性。 - 用户指定了Java 21,所以我应该确认在Java 21中它仍然可用且稳定。 回答结构: 1. **介绍**:简要解释instanceof模式匹配是什么。 2. **核心特性**:描述语法和用法。 3. **示例**:提供Java 21中的代码示例。 4. **优势**:解释为什么有用。 5. **相关问题**:生成相关问题。 生成相关问题: - 基于主题,如Java模式匹配的其他方面、比较不同版本等。 确保回答真实可靠: - 基于我的知识,instanceof模式匹配在Java 16引入,Java 17稳定。Java 21可能没有新特性,但它是标准。 - 使用提供的引用作为参考,但引用[4]是关于switch的,不是instanceof。所以主要参考引用[1]、[2]、[3]。 代码示例: - 从引用[3]中提取:`if (obj instanceof String s) { System.out.println(s.length()); }` - 这是instanceof模式匹配的经典示例。 在Java 21中: - 由于instanceof模式匹配在Java 17后稳定,Java 21中用法相同。 - 我可以提供一个示例。 完整示例: ```java public class Main { public static void main(String[] args) { Object obj = "Hello, Java 21!"; if (obj instanceof String str) { System.out.println("String length: " + str.length()); } else { System.out.println("Not a string"); } } } ``` 添加引用: - 在描述时,引用相关部分。例如,当解释时,添加引用标识。 最后,生成相关问题: - 例如: 1. Java 21中switch模式匹配的示例是什么? 2. 模式匹配在Java中的演进历史如何? 3. 使用模式匹配有哪些最佳实践? 回答语言:中文。</think>### Java 21 instanceof模式匹配示例 在Java 21中,`instanceof`的模式匹配(Pattern Matching)是一个稳定特性,它通过声明式语法简化类型检查和自动转型,避免了显式类型转换的冗余代码。这一特性最初在Java 16中作为预览功能引入(JEP 394),并在Java 17中正式稳定(JEP 394)。Java 21延续了该特性,未做重大更改,但保持了其核心优势:提高代码可读性、减少错误,并增强类型安全性[^1][^3]。 #### 核心特性与语法 - **语法**:`obj instanceof Type variableName` - 检查`obj`是否为`Type`类型。 - 如果是,自动将`obj`转型为`Type`类型,并赋值给新变量`variableName`。 - 变量作用域仅限于`if`块或匹配分支内。 - **优势**: - 消除显式类型转换(如`(String) obj`)。 - 减少代码冗余,提高可读性。 - 增强编译时类型检查,避免`ClassCastException`风险[^2][^3]。 #### Java 21示例代码 以下是一个完整的Java 21示例,演示`instanceof`模式匹配的用法。代码中,我们检查一个`Object`类型变量是否为`String`或`Integer`,并直接使用转型后的变量。 ```java public class PatternMatchingExample { public static void main(String[] args) { Object obj1 = "Hello, Java 21!"; // 字符串示例 Object obj2 = 42; // 整数示例 Object obj3 = 3.14; // 非字符串或整数示例 // 使用 instanceof 模式匹配检查并处理字符串 if (obj1 instanceof String str) { System.out.println("字符串长度: " + str.length()); // 直接使用 str 变量 } else { System.out.println("obj1 不是字符串"); } // 检查整数类型 if (obj2 instanceof Integer num) { System.out.println("整数值: " + num.intValue()); // 直接使用 num 变量 } else { System.out.println("obj2 不是整数"); } // 处理其他类型 if (obj3 instanceof String s) { System.out.println(s.toUpperCase()); } else { System.out.println("obj3 不是字符串"); } } } ``` **输出示例**: ``` 字符串长度: 15 整数值: 42 obj3 不是字符串 ``` **代码解释**: 1. 当`obj1`是`String`类型时,`instanceof`自动将其转型为`str`变量,无需手动转换。 2. 类似地,`obj2`作为`Integer`类型时,直接使用`num`变量调用方法。 3. 如果类型不匹配(如`obj3`),进入`else`分支处理。 4. 变量(如`str`或`num`)的作用域仅限于`if`块内,避免命名冲突[^1][^3]。 #### 为什么推荐使用? - **减少错误**:传统方式需要显式转型,容易遗漏或出错(如`if (obj instanceof String) { String s = (String) obj; ... }`)。模式匹配自动处理转型,更安全。 - **性能无影响**:编译后字节码与手动转型等效,无运行时开销。 - **与switch集成**:Java 21的`switch`表达式也支持模式匹配(如引用[4]所示),但`instanceof`单独用于条件分支时更简洁[^3][^4]。 在Java 21中,该特性已完全稳定,建议在需要类型检查和操作的场景中使用,以提升代码质量[^1][^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值