钩子
从今天起进入新模块:面向对象。
这个词你肯定听过,八个字版本叫"一切皆对象"。听着像玄学,其实一点都不玄——这篇文章我用一份外卖订单讲清楚它,顺便还两笔前面欠下的债:
- main 方法前面那个 static,到底是干嘛的?
- args 为什么是 String[] 类型,而不是 String?
还有第 12 篇留的悬念:length 为什么不带括号。
01 对象:现实世界的东西,装进代码
想一个外卖订单,它有什么?
- 它有数据:店铺名、菜品清单、总价、配送状态;
- 它有行为:可以支付、可以取消、可以催单。
在 Java 里,这种"数据 + 行为"打包在一起的东西,就叫对象(Object)。
回头看我们写了 12 篇的 int、double:它们只能装数据,没有行为——10 就是 10,你不能让 10 "支付"。而订单不一样,它既记着账,又能执行动作。
"一切皆对象"的意思是:Java 的世界观里,程序就是把现实世界的各种"东西"建模出来的。 订单是对象,购物车是对象,一篇公众号文章也是对象(有标题、有正文,能发布、能删除)。

02 类:对象的图纸
问题来了:订单是对象,那"类(Class)"是什么?
类是图纸,对象是按图纸造出来的楼。
一份订单图纸规定了:订单必须有店铺名、总价、状态这几个格子,必须有支付、取消这几个动作。但图纸本身不是订单——图纸写不出"这一单花了 28 块"。
造出来的每一栋楼(每一个具体的订单)才有真实的数据:这单是黄焖鸡 28 块,那单是瑞幸 15 块。图纸只有一份,楼可以盖无数栋。
用代码说:Order 是类,"黄焖鸡那单" 和 "瑞幸那单" 是两个对象。
03 引用类型初见:变量这次存的是地址
前面 12 篇,int a = 10; 里 a 存的就是 10 本身。但对象不一样:
Order o1 = new Order(); // 按图纸造一栋楼,o1 拿到的是楼的地址
o1.shopName = "黄焖鸡米饭";
o1.total = 28.0;
new Order() 干了三件事:在堆里开辟空间造对象 → 执行初始化 → 把地址交给 o1。o1 里存的不是订单本身,是订单的地址——还记得第 12 篇的栈和堆吗?一模一样的道理。
所以下面的输出,你能猜到吗:
Order o2 = o1; // 把地址复制给 o2,两变量指向同一栋楼
o2.total = 30.0;
System.out.println(o1.total); // 30.0!o1 也"变"了
不是变魔术,是因为根本只有一栋楼,o1 和 o2 是同一栋楼的两个门牌号。
04 还债:static、String[] args、length 三案并审
现在能讲清楚前面的债了。
第一案:为什么 main 方法要 static?
程序启动时,JVM 调用 main——但此刻一个对象都还不存在(main 就是用来启动一切的,鸡还没生出来)。所以 main 必须属于"类"本身,而不属于某个对象。static 的意思就是:这个东西属于类,不需要对象就能用。 这也是为什么你在 static 方法里直接调非 static 方法会报错——非 static 方法需要对象,而对象还没有。
第二案:args 为什么是 String[]?
你在命令行敲 java ArgsDemo 张三 25,JVM 把参数收集起来传给 main。注意,是"一组字符串":张三是一个、25 也是一个。一组 → 数组,都是文本 → String,所以是 String[]。第 5 篇埋的伏笔,今天闭环。
第三案:length 为什么不带括号?
数组是对象,length 是它身上一个写死的属性(每造一个数组,长度就定死在它身上);而 String 是类,长度是它提供的功能(方法)。属性不带括号,方法带括号——就这么简单。
本文示例代码均已本地实测通过,可直接运行。
对应文件:OrderDemo.java
橙码酱,分享更有用的技术知识,助你成为更优秀的开发者。