112、类与对象基础:从一次“变量神秘消失”说起

112、类与对象基础:从一次“变量神秘消失”说起 112、类与对象基础:从一次“变量神秘消失”说起那天的场景我记得很清楚。一个很常规的ALV报表增强,我在某个全局类里加了一个计数器,想在主程序里多次调用同一个方法后累计打印次数。代码写得很顺,SE24里创建类、定义属性、实现方法,然后回主程序里CREATE OBJECT、CALL METHOD,一切似乎都在预料之中。可是跑起来之后,计数器永远只显示1。我把断点打在那个方法内部,属性值明明已经加到3了,一退到外面再读,又是0。那时候我还没完全想通:这到底是被谁重置了?还是我写的逻辑有问题?我甚至怀疑是不是SAP有bug。后来才知道,我掉进的是最基础的“类与对象”概念坑——我一直在用同一个类创建了两个不同的对象,方法里改的是A对象的属性,外面读的却是B对象的属性。那个瞬间,我才真正意识到:类只是一个模板,对象才是真实的运行个体。这个话题放到今天讲,虽然目录上写着“类与对象基础”,但我想换个方式说。不是从“类是抽象的概念,对象是具体的实例”这种教科书定义开始,而是直接面对刚才那个场景。为什么同样的代码,两个变量互不相干?因为每一个CREATE OBJECT生成的实例,都拥有自己独立的一份属性存储空间。如果你在程序里写了两次CREATE OBJECT lo_obj,那就有两个盒子,每个盒子里都有一份自己的计数器。方法代码只有一份,但方法操作的数据属于调用它的那个实例。这就好比食堂的菜谱是一张纸,但每个厨师炒出来的鱼香肉丝,用的都是自己灶台上的那碗肉丝,不是共享的。那么怎么正确地用一个类来管理一个共享状态?最简单的办法,要么外面只创建一个对象,反复用这个句柄去调用方法;要么把属性改成