基本数据类型存值本身,引用类型存对象地址;Java仅有byte、short、int、long、float、double、char、boolean共8种基本类型,其余均为引用类型。

最直接的区分方式看定义和内存行为:基本数据类型是语言内置的、存值本身;引用数据类型是基于类/接口/数组等构建的、存对象地址。
看类型列表是否固定
Java 明确只有 8 种基本数据类型,一个都不能多、不能少:
- 整数型:byte、short、int、long
- 浮点型:float、double
- 字符型:char
- 布尔型:boolean
除此之外,所有类型都是引用类型——包括 String、ArrayList、int[]、List、自定义的 Person 类、enum、interface 实现类等。哪怕 int[] 看起来像“基本类型加方括号”,它也是引用类型。
看变量存储的内容是什么
声明变量时,实际存的是什么,决定了它是哪一类:
立即学习“Java免费学习笔记(深入)”;
- 基本类型:变量里直接放数值。比如 int a = 100,栈中 a 的位置就存着 100 这个数字。
- 引用类型:变量里只放一个地址(类似门牌号),真实数据在堆里。比如 String s = "hello",s 存的是堆中那个字符串对象的起始地址,不是 "hello" 本身。
看默认值和比较方式
这两点在写代码时最容易暴露差异:
- 局部变量未初始化时,基本类型不能直接用(编译报错);但成员变量有默认值:数值型为 0,boolean 为 false,char 为 '\u0000';引用类型成员变量默认值统一是 null。
- 用 == 比较:int x = 5; int y = 5; → x == y 是 true(比值);String a = "abc"; String b = new String("abc"); → a == b 是 false(比地址),必须用 a.equals(b) 才能比内容。
看参数传递时的行为
方法调用传参是验证区别的实用场景:
- 传基本类型(如 int),进方法后得到的是原值的副本,方法内改它,不影响外面的变量。
- 传引用类型(如 ArrayList),进方法后得到的是地址的副本,仍指向堆中同一个对象,方法内 add() 或 set() 会直接影响原始集合。


















