回去让他的小白给她买了一些编程书籍,可还是记不住类和对象。
这怎么行呢?类和对象是整个面向对象编程的基石啊!必须搞懂!
所以,小白奶奶又来敲门了。。。
好吧,看老奶奶这么好学,我这次直接就讲了。
本文围绕王总转型制造业造鞋厂的故事,来展示讲述。
什么是类(class)和对象(object)?
我们这次主人公还是王总。不过由于房市业务遇冷觉得,他转型改行开了一个大型鞋厂,潮鞋品牌,准备上下游一条龙整齐全了。
虽然新冠之前,王总每天能生产100万双鞋子,卖的也很火。不过新冠后,订单量少了很多。
于是他就请来了专业的商业咨询机构。走进厂里一看,你这里的几十款鞋子都是老旧款式得设计多一些新款啦。
小白奶奶听了又是着急又一头雾水,见我没想要停下来解释概念。
直接打断讲解,“雷学委,请问扯半天这关类什么事啊?”
我扶了扶眼镜,话都讲不到三句呢!这不正讲到了重点了。(没错,雷学委戴眼镜的,其他都是假冒!)
‘类’就是商业顾问说的新款式。多个新款式就是多个不同的‘类’。像造鞋厂得根据不同类型制作模具,然后从模具来批量生产鞋子。
类是现实世界或思维世界中的实体在计算机中的反映,它将数据以及这些数据上的操作封装在一起。
小白奶奶说哦,那新鞋子算不算一个新的类啊?
雷学委摇摇头,这不是类了,新鞋子从款式的模型中做好了,已经不是类了,而是对象!
小白奶奶又说了,但是尺寸编号不一样啊,你刚刚不是说不同款型就说类吗?这不就矛盾了。
我摇摇头,那还是同一款式的鞋。
你看到鞋子是对象,对象他有自己的鞋码,颜色等,但是有一个唯一的编号。
对象是具有类类型的变量,类的一个具体实例。
售货员也是按这个编号来管理的,每出售一双鞋子就把这个编号标记为已出售!
奶奶说,好像明白了一点。是不是鞋子模具或者设计图就等同于类呢,具体买到的鞋子就是对象?
奶奶自己在那嘀咕了一会,嗯,没错。
那你能够说告诉我它们的区别不? 我现在感觉类和对象一个说的是鞋款概念和一个说的是一双实物鞋子。(学委觉得老奶奶领悟能力不比年轻人差啊)
类和对象的区别
类具有普遍性代指一个类似的群体;对象具有特殊性,是唯一个体
类是什么对普遍事物的一般化。比如一些产品的模具就是类。它是对一整类事物的概括描述
对象是类实例化的,一个类的某个实例,比如根据某个型号模具而制作出来的鞋子,它只能是一个具体的个体。
下面展示代码了:
雷学委创建了一个 Shoe类,这个类下面分了几个大牌子叫做XAnta,X361Du,以及XLeixw (呵呵,雷学委自创品牌)等。
这几个大牌子下面还有各个款式细分。
我们看到的XAnta鞋子这个概念就是一个大类,再如XAnta春季款鞋子就是这个大类下的一个分支类。
消费者最后拿到手的,会是一对XAnta春季款39码,银灰色潮流时尚款,如上图序列号(SN1639705018),就是一个对象。
奶奶此刻很高兴:”原来就这么简单,还挺具体的!“
好,我们看看下面看看类的代码实现:
package org.levintech.javademo.leixuewei.classobject; /** * @author levin * Created on 2021/6/20 * [雷学委] CSDN/Juejin Code Demo */ public class Shoe { private int size; private String color; public Shoe(int size, String color) { this.size = size; this.color = color; } public int getSize() { return size; } public String getColor() { return color; } @Override public String toString() { return "Shoe{" + "size='" + size + '\'' + ", color='" + color + '\'' + ", serialNo='" + hashCode() + '\'' + '}'; } } /** * XAnta */ class XAntaShoe extends Shoe { private String brand = "XAnta"; public XAntaShoe(int size, String color) { super(size, color); } @Override public String toString() { return "XAntaShoe{" + "size='" + getSize() + '\'' + ", color='" + getColor() + '\'' + ", serialNo='" + hashCode() + '\'' + ", brand='" + brand + '\'' + '}'; } } /** * X361Du */ class X361DuShoe extends Shoe { private String brand = "X361Du"; public X361DuShoe(int size, String color) { super(size, color); } @Override public String toString() { return "X361DuShoe{" + "size='" + getSize() + '\'' + ", color='" + getColor() + '\'' + ", serialNo='" + hashCode() + '\'' + ", brand='" + brand + '\'' + '}'; } } /** * XLeixw */ class XLeixw extends Shoe { private String brand = "XLeixw"; public XLeixw(int size, String color) { super(size, color); } @Override public String toString() { return "XLeixw{" + "size='" + getSize() + '\'' + ", color='" + getColor() + '\'' + ", serialNo='" + hashCode() + '\'' + ", brand='" + brand + '\'' + '}'; } }
上面定义了4个类,一个大的鞋(Shoe)类,有尺寸(size),颜色(color)这两个特征)。然后XAntaShoe这个类,具有自己的品牌(brand),其他两个类也是如此。
然后每一个类都覆盖了toString方法,把鞋子的信息打印出来了,像XAntaShoe/X361Du/XLeixw 等鞋类还打印了品牌信息。
运行示例程序的代码如下。:
public class LeiXueWeiRunner { public static void main(String[] args) { System.out.println("【雷学委代码Demo】"); Shoe anta01 = new XAntaShoe(40, "black"); println(anta01); Shoe x36101 = new X361DuShoe(40, "blue"); println(x36101); System.out.println(anta01 == x36101); //打印每双鞋的hashcode System.out.println(anta01.hashCode()); System.out.println(x36101.hashCode()); //创建两双同码同色的鞋子,我们可以留意到两双尺码颜色同款鞋,序列号不一样! println(new XAntaShoe(40, "black")); println(new XAntaShoe(40, "black")); //创建anta04 跟 anta04 颜色款式尺寸一样,看看是否相同对象 Shoe anta04 = new XAntaShoe(40, "black"); System.out.println("anta01 与 anta04是否相同?" + (anta01 == anta04));//这个判断是比较引用的 System.out.println("anta01 与 anta04是否相同?" + (anta01.equals(anta04)));//这个才是真正判断对象是否相同的 } public static void println(Shoe shoe) { System.out.println("鞋:" + shoe); } }
运行效果图如下:
这里打印的就是特定的对象。我们看到,每个鞋都有一个序列编号(serialNo),而且是唯一的。
类是没有状态的,对象是有状态的,有具体的值!
只要创建新对象,不管是同款式的同个鞋码颜色,这个序列号都会变化。
而且,我们判断anta01跟anta04是否相同的对象(同一双鞋)。答案是:也就是不管一个类实例属性值都相同了,但系统认为它们仍不是同一个对象!
类是持续存在的,而对象只存在于内存之中,随着程序执行结束而销毁了!
上面的实例代码运行结束后,我们是无法再找回这个对象的。
但是类仍然存在当前系统的磁盘上, 如上图.class文件(类的字节码文件)。
总结
本文讲解了类和对象
类普遍代指含义
对象的特殊性,对象是一个唯一的个体
类和对象的区别
上面的说的大型鞋厂就像一个JVM(Java虚拟机)一样,时刻不停的从模具(.class文件)中制造鞋子(创建对象object),然后卖出鞋子。
语言(Java)只是用来表达的,核心原理其他语言都适用,刷几百万都买不来这么值的!
先说到这里,以后都会再谈,关注长期阅读 =>雷学委趣味编程故事汇编
彩蛋:实际应用中,有些场景我们会认为属性都相等的对象相等,雷学委已经在XLeixw类重写了相关方法,读者可以自行下载文末代码,试着创建两个款XLeixw同个颜色尺寸的鞋子判断是否相同。