老铁们,上一篇,我们了解了什么是“类”(点击查看前文)今儿个咱们唠唠这个“类”啊,这玩意儿到底有啥用?
“类”是咱们编程世界里的大拿,跟现实世界那叫一个紧密相连。
咱得好好掰扯掰扯,这“类”到底是咋回事,咋就能把现实世界给抽象化了呢?
首先,咱得明白,这个“类”啊,它就像是现实世界的一个影子,咱们用编程语言给它画出来。比如说,咱们看到的猫啊狗啊,那都是现实世界里的东西,咱们用“类”来给它们建模,这不就是抽象映射嘛!咱们是辩证唯物主义的好学生,得明白,这“类”不是凭空来的,它是现实世界的产物,但同时呢,它也能反作用于现实世界,这得好好琢磨琢磨。
“类”对应的英文是“class”。咱们中文里,给“类”组个词,最直接想到的就是“分类”。说到分类,咱们小时候生物课上学的那个生物分类。生物分界、门、纲、目、科、属、种,这一套下来,那叫一个细致。这分类方式,就像是个树状图,跟数据结构里的树形结构似的,每一种生物,最后都得落到“种”这个级别上。
老铁们可能要问了,这分类跟面向对象的“class”有啥关系啊?
哎,关系大了去了!咱们定义一个“class”的时候,都得有属性,这些属性啊,根据它们的取值范围或者不同,就能对实例化对象进行分类。比如说,咱们定义一个“Number”类,那这个类的实例化结果,最后肯定得落在实数轴或者虚数轴上,要是实数,还能分成正数、负数或者零,对吧?
再举个例子,咱们有个“Creature”类,里面有个属性“hasSpinalColumn”,这个属性是true还是false,那就能把生物分成有脊椎动物门和无脊椎动物门。类似的,还有很多属性,比如有没有毛发、有没有鳞片、有没有四肢、有没有眼睛,是单眼还是复眼。咱们通过这些属性,用单一属性或者属性组合来分类,这不就能对现实世界的任何一个实例化对象进行分类了嘛!
Java Code |
// 举个简单的Java代码示例 class Creature { boolean hasSpinalColumn; boolean hasHair; boolean hasScales; boolean hasLimbs; boolean hasEyes; String eyeType; // 单眼还是复眼 // 构造函数 public Creature(boolean hasSpinalColumn, boolean hasHair, boolean hasScales, boolean hasLimbs, boolean hasEyes, String eyeType) { this.hasSpinalColumn = hasSpinalColumn; this.hasHair = hasHair; this.hasScales = hasScales; this.hasLimbs = hasLimbs; this.hasEyes = hasEyes; this.eyeType = eyeType; } // 分类方法 public String classify() { if (hasSpinalColumn) { return "有脊椎动物门"; } else { return "无脊椎动物门"; } } } // 使用示例 public class Main { public static void main(String[] args) { Creature cat = new Creature(true, true, false, true, true, "单眼"); System.out.println("猫属于:" + cat.classify()); } } |
老铁们,脑子里还有问号?这玩意儿有啥用啊?
那我给你们举个工作中的例子。有个同事,她得做个弹药的分类,这分类得在一个页面里做成下拉框。弹药咋分类,甲方没说,她也不懂。我就给她讲了分类法,最后分类结果是:弹药来源分类、物理性质分类、使用用途分类等等。这分类方式,得根据实际情况来,得有个兜底的“其他”。
比如说,弹药来源分类。
可以是生产中弹药、运输中弹药、备用弹药、上膛弹药、缴获弹药、捡的,还有其他。
物理性质分类呢,可以是固体弹药、液体弹药、气体弹药、包装弹药、散装弹药之类的。
使用用途分类,可以是枪弹、炮弹、火箭弹、导弹、炸药、散装药、伪装药(地雷)、未分类其他药(可能是缴获的用途不明的)。
说到这儿,基本上这功能该有的分类方式就有了。弹药得按多种方式分类,比如谁用的,空军、陆军、海军,然后是单兵、班级别、排级别,再按火力范围、包装产品、型号或者口径继续分。这分类方式,也是个树状图,一层层分下去。
Java Code |
// 弹药类 class Ammunition { String source; // 弹药来源 String physicalProperty; // 物理性质 String usage; // 使用用途 // 构造函数 public Ammunition(String source, String physicalProperty, String usage) { this.source = source; this.physicalProperty = physicalProperty; this.usage = usage; } // 根据来源分类 public String classifyBySource() { switch (source) { case "生产": return "生产中弹药"; case "运输": return "运输中弹药"; case "备用": return "备用弹药"; case "上膛": return "上膛弹药"; case "缴获": return "缴获弹药"; case "捡的": return "捡的弹药"; default: return "其他"; } } // 根据物理性质分类 public String classifyByPhysicalProperty() { switch (physicalProperty) { case "固体": return "固体弹药"; case "液体": return "液体弹药"; case "气体": return "气体弹药"; case "包装": return "包装弹药"; case "散装": return "散装弹药"; default: return "其他"; } } // 根据使用用途分类 public String classifyByUsage() { switch (usage) { case "枪弹": return "枪弹"; case "炮弹": return "炮弹"; case "火箭弹": return "火箭弹"; case "导弹": return "导弹"; case "炸药": return "炸药"; case "散装药": return "散装药"; case "伪装药": return "伪装药(地雷)"; default: return "未分类其他药"; } } } // 使用示例 public class Main { public static void main(String[] args) { Ammunition ammo1 = new Ammunition("生产", "固体", "枪弹"); System.out.println("弹药1来源分类:" + ammo1.classifyBySource()); System.out.println("弹药1物理性质分类:" + ammo1.classifyByPhysicalProperty()); System.out.println("弹药1使用用途分类:" + ammo1.classifyByUsage()); Ammunition ammo2 = new Ammunition("缴获", "液体", "导弹"); System.out.println("弹药2来源分类:" + ammo2.classifyBySource()); System.out.println("弹药2物理性质分类:" + ammo2.classifyByPhysicalProperty()); System.out.println("弹药2使用用途分类:" + ammo2.classifyByUsage()); } } |
说到这里,我简单的阐述一下我当年所讲的分类法的结论。
分类法,使用面向对象的方式对事物进行建模,以单个或多个属性为分类标准,对这个事物(class)进行分类。分类的结果必定要分类完全,或者有兜底分类,如果分类过程中,以某个标准分类,结果落在了两个类中,而不是唯一的,说明分类标准选取错误。即使分类标准错误,也可能有意义。
好了,篇幅有限,就唠到这儿。要是觉得还不够,建议找毛选第一册第一章,看看教员咋分类人的,仔细琢磨琢磨,能不能用这方式去建模,决定满足啥属性或者属性搭配,才能确定这人是伙伴、敌人,还是有统战价值。
感觉当年读了教员这内容的人,没看懂的居多。下一篇咱们就着分类法,讲讲咋做职业规划吧,方法论嘛,少讲技术细节,多讲技术应用,抛砖引玉才重要,引起思考才重要。
老铁们!咱们编程啊,就得这么来,把现实世界的逻辑搬到代码里,这样才能做出有用的东西来。
好了,今儿个就唠到这儿,咱们下篇再见!