object形参利用java所有类默认继承object的特性统一接收引用类型,不支持基本类型字面量;接收后需用instanceof或getclass()判型再安全转型,并注意null防护与泛型擦除问题。

Java 中用 Object 作为方法形参,本质是利用所有类都隐式继承自 Object 的特性,实现参数类型的统一接收。它不是“万能兜底”,而是有明确边界和使用前提的——只适用于引用类型,不包括基本类型(如 int、boolean 等),但基本类型的包装类(Integer、Boolean)可以。
为什么 Object 能接收任意对象?
因为 Java 规定:所有类(包括数组、接口实现类、枚举、注解)默认直接或间接继承自 Object。即使你没写 extends Object,编译器也会自动补上。所以:
-
String s = "abc"; function(s);→ 合法,String是Object子类 -
ArrayList<string> list = new ArrayList(); function(list);</string>→ 合法,集合类也是Object子类 -
int[] arr = {1,2,3}; function(arr);→ 合法,数组是引用类型,也继承Object -
function(100);→ 编译报错,100是int基本类型;但function(new Integer(100))或function(100)(自动装箱后)可过
接收之后怎么安全处理?
光能接收不等于能直接用。必须先判断实际类型,再向下转型或调用对应逻辑,否则容易抛 ClassCastException:
- 用
instanceof判断具体类型,再强制转换(推荐用于已知有限类型场景) - 用
obj.getClass()获取运行时类,适合需反射或动态分发的场景 - 避免无检查直接强转:
(String)obj可能崩溃,务必前置校验 - 对 null 值始终先判空,
instanceof对null返回false,但调用方法前仍需防护
常见误用与规避方式
很多人以为 Object 参数能“自动适配一切”,结果在运行时出错。关键注意点:
- 不能接收基本类型字面量(如
5、true),但可接收其包装类实例或依赖自动装箱 - 泛型擦除后,
List<string></string>和List<integer></integer>传入Object后无法区分泛型信息,需靠业务逻辑或额外标记识别 - 数组类型需单独判断:
if (obj instanceof int[])、if (obj instanceof String[]),不能混为一谈 - 接口实现类可用
Object接收,但调用接口方法前必须转回接口类型,如((MyInterface)obj).doSomething()
实用小技巧:结合 toString() 和 equals() 快速调试
Object 自带的通用方法在调试和日志中很实用:
-
obj.toString()默认返回类名@哈希码,建议在业务类中重写,返回有意义信息 -
obj.equals(anotherObj)默认比较内存地址,若需值比较,务必重写equals(并配套hashCode) -
System.out.println(obj)实际调用的就是toString(),重写后打印更直观
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











