当前位置: 首页 > 科技观察

零基础学Java:对象和类

时间:2023-03-21 18:40:28 科技观察

"二哥,那天我在图书馆复习你上一节讲的内容,正好遇到一个学长,他问我有没有‘对象’,我说不要。结果你猜他说什么,'要不要我给你一个新的?'我当时就懵了,二哥new是什么意思?”三姐满脸疑惑的问我。“哈哈,三妹,你学长真幽默,new是Java中的一个关键字,用来把一个类变成一个对象。”我笑着对三妹说:“对象和类是Java中最基本的两个东西,这个概念可以说撑起了面向对象编程(OOP)的天空。”01.要问面向过程和面向对象的三姐,什么是OOP?OOP的英文全称是ObjectOrientedProgramming。要想理解它,就必须先理解面向对象,而要想理解面向对象,就必须先理解面向过程,因为一开始没有面向对象的编程语言,都是过程导向。举一个简单的例子来区分面向过程和面向对象。有一天,你想吃一小碗汤,怎么办?有两种选择:1)自己买食材,比如豆腐皮、肉、蒜苔等,自己做。2)去饭店,只要对老板喊一声“一小碗汤”就可以了。第一个是面向过程的,第二个是面向对象的。面向过程的缺点是什么?如果买了一小碗汤的材料,最后想吃宫保鸡丁,是不是还要再买材料?面向对象的优点是什么?如果你不想吃一小碗汤做好了,你只需要对老板说,“如果那小碗汤不是我做的,就换成宫保鸡丁吧!”过程是面向过程的,按部就班,上一步做完了,再做下一步。面向对象是模块化的,我做我的,你做你的,需要你做我就告诉你。我不需要知道你是怎么做到的,我只看功劳不看努力。不过说到底,面向对象的底层其实是面向过程的,只是把面向过程抽象出来封装成类,方便我们调用。02.类对象可以是现实中任何可以看到的对象,比如特立独行的猪;也可以是想象中的任何虚拟物体,比如七十二变孙悟空。Java通过类来定义这些对象。这些对象的状态由字段定义。比如猪的颜色是纯色还是花纹;这些对象的行为由方法定义。例如,猪会吃东西,会睡觉。来,定义一个简单的类给你看。/***微信搜索“沉默王二”,回复Java**@作者沉默王二*@date2020/11/19*/publicclassPerson{privateStringname;privateintage;privateintsex;privatevoideat(){}privatevoidsleep(){}privatevoiddadoudou(){}}一个类可以包含:字段(Filed)方法(Method)构造函数(Constructor)在Person类中,有3个字段,分别是name、age和sex,也称为成员变量——在类Internal中但在方法之外,方法内部的那些称为临时变量。成员变量有时称为实例变量。它们在编译时不占用内存空间,在运行时获取内存。也就是说,只有在对象被实例化(newPerson())之后,字段才会获取内存,这也是事实。是它被称为“实例”变量的原因。有3个方法,分别是eat()、sleep()和dadoudou(),表示Person对象可以做什么,吃、睡、打豆豆。三姐是不是想问,为什么没有施工方法?的确,在Person类的源代码文件(.java)中是看不到的,但是在反编译后的字节码文件(.class)中可以看到。////Sourcecoderecreatedfroma.classfilebyIntelliJIDEA//(poweredbyFernflowerdecompiler)//packagecom.itwanger.twentythree;publicclassPerson{privateStringname;privateintage;privateintsex;publicPerson(){}privatevoideat(){}privatevoidsleep(){}privatevoiddadoudou(){}privatevoiddadoudou()Person(){}是默认构造方法,因为是空构造方法(方法体中没有内容),所以可以默认。这就是Java聪明的地方。一些很死板的代码不需要开发者添加,它会偷偷的做。03.newanobject创建Java对象时,需要用到new关键字。Personperson=newPerson();这行代码通过Person类创建了一个Person对象。所有对象在创建时都会在堆内存中分配空间。创建对象时,需要一个main()方法作为入口点。main()方法可以在当前类中,也可以在另一个类中。第一种:main()方法直接放在Person类中。publicclassPerson{privateStringname;privateintage;privateintsex;privatevoideat(){}privatevoidsleep(){}privatevoiddadoudou(){}publicstaticvoidmain(String[]args){Personperson=newPerson();System.out.println(person.name);System.out.println(person.age);System.out.println(person.sex);}}输出结果如下:null00第二种:main()方法不在Person类中,在另外一个类中。在实际开发中,我们通常不会直接在当前类中创建一个对象并使用它,而是将其放在使用该对象的类中,比如上图中的PersonTest类。您可以将PersonTest类和Person类放在两个文件中,也可以将它们放在一个文件中(名为PersonTest.java),如下所示。/***@作者微信搜索“沉默之王二”,回复关键字PDF*/publicclassPersonTest{publicstaticvoidmain(String[]args){Personperson=newPerson();}}classPerson{privateStringname;privateintage;privateintsex;privatevoideat(){}privatevoidsleep(){}privatevoiddadoudou(){}}04.初始化对象在前面的例子中,程序输出结果是:null00为什么会有这样的输出结果呢?因为Person对象没有初始化,所以String的默认值是输出null,int的默认值为0。那么如何初始化Person对象(赋值给字段)呢?第一种方式:通过对象的引用变量。publicclassPerson{privateStringname;privateintage;privateintsex;publicstaticvoidmain(String[]args){Personperson=newPerson();person.name="沉默之王二";person.age=18;person.sex=1;System.out.println(person.name);System.out.println(person.age);System.out.println(person.sex);}}person调用对象Person的引用变量,如下图:通过引用对象的变量,可以直接初始化字段(person.name="沉默王二"),所以上面代码的输出结果如下:沉默王二181第二种方法:方法初始化。/***@author沉默王二,有趣的程序员*/publicclassPerson{privateStringname;privateintage;privateintsex;publicvoidinitialize(Stringn,inta,ints){name=n;age=a;sex=s;}publicstaticvoidmain(String[]args){Personperson=newPerson();person.initialize("沉默之王二",18,1);System.out.println(person.name);System.out.println(person.age);System.out.println(person.sex);}}在Person类中增加一个新的方法initialize(),然后在创建一个新对象(person.initialize("SilentKingTwo",18,1))后传递参数进行初始化。第三种方式:通过构造函数初始化。/***@author沉默王二,有趣的程序员*/publicclassPerson{privateStringname;privateintage;privateintsex;publicPerson(Stringname,intage,intsex){this.name=name;this.age=age;this.sex=sex;}publicstaticvoidmain(String[]args){Personperson=newPerson("沉默王二",18,1);System.out.println(person.name);System.out.println(person.age);System.out.println(person.sex);}}这也是最标准的new的时候直接传参的方式。补充一点知识,匿名对象。匿名对象意味着没有引用变量,创建时只能使用一次。新人();通过匿名对象可以直接调用该方法:newPerson().initialize("沉默王二",18,1);“好吧,三姐,我们先说说Java中的对象和类吧。”我扭过僵硬的脖子,对三姐说道。“行了,哥辛苦了,我给你按摩一下。”本文转载自微信公众号“沉默王二”,可通过以下二维码关注。转载本文请联系沉默王二公众号。