首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

看球学习两不误 看世界杯 学面向对象

java零基础入门-面向对象篇(三) 类和对象 (上)

前面的基础打的差不多了,基础部分其实很多语言都大同小异,但是接下来的可是面向对象语言独有的知识了,这是java中最核心最重要的部分,没有之一。关于面向对象的一些概念,我在前面有篇文章简单的提了一下,没看过的同学快去补课(传送门:

关于面向对象 女神告诉你什么是三大特性

)。

我们这次直接来个实例讲解,因为我们学java之后基本都会做web相关的项目,所以我直接用web的模式来给大家讲讲基础知识,我会自动屏蔽目前不需要知道的知识,请放心。

需求分析

老板:“小码啊!现在世界杯很火啊,给我的首页加一个小组积分榜,明天早上能看到就行了”

我:“老板,这个有点麻烦啊,晚上不是要熬夜加班?”

老板:“你看看你,球迷们熬夜看球不辛苦吗?啊?他们有抱怨吗?啊?我报销宵夜还不够吗?啊啊啊?小码啊,觉悟还要提高啊~”

我:“......”

苦逼的程序员已经习惯了,我们还是老老实实看需求吧。

积分榜

我们前面有说过,一个软件的开发周期中,有一个很重要的环节,叫做需求制定,这个时候会有设计文档和产品原型,作为一个程序员,我们必须学会看这两种文档,然后根据文档将制作页面和数据。我们用上图作为原型设计来讲解一下(原型设计就是一个功能完成后会是什么样子)。

原型分析

我们首先要做的,就是把页面功能里面的动态数据和静态数据分离出来,这样就可以明确前后端开发的分工,哪部分是前端开发,哪些是后端开发。上图绿色部分,就是后端需要提供的数据。下面对这个原型进行一个分解,大家看起来会更明白一点。

原型分析

这样看不知道大家理解了没有,其实页面就像一个模板,我们不管有几个分组,使用同一个模板进行布局即可,然后再通过后端提供的数据,往前端制作好的模板里面填充数据即可。过程跟下面这个很像。

人形立牌

现在应该懂了吧,我们为什么要前后分离开。我们已经将一个需求分解到任务了,就是我们已经知道我们要做什么了,我们需要返回一个小组中各个球队的数据情况。我们都知道,java项目是由一个个类组成的,我们的类是java的一等公民,那我们如何设计一个类,来告诉前端这些数据呢?我们接着往下看。

类的结构

类是对一类事物的抽象,也就是说我们的球队是对每个具体球队的抽象。比如说,球队是抽象的,乌拉圭,俄罗斯,沙特阿拉伯,埃及这些球队是具体的,那么我们就将球队抽象出来做成一个类就行了。类的结构可以很复杂,但是基本上都会有3个部分组成,成员变量,构造器,方法。

成员变量就是这个类有哪些属性,比如我们的球队有名称,场次,胜平负等数据,这些就是描述球队的属性,成员变量一般就是描述类的属性,比如人这个类,他的属性有身高,体重,性别等等,这些都可以作为人这个类的成员变量。

构造器,专门用来创建对象的方法,通过类来创建对象会使用new这个关键字,使用new来创建对象就会调用构造器,然后得到的就是类的实例,也就是对象。比如根据球队类,创建出来的对象就可以是乌拉圭队,俄罗斯队等等,这两个队只是改了一下名字这个属性。

方法,用于描述类的行为,可以将成员变量理解成名词,方法理解为动词,成员变量定义了属性,方法定义了动作。比如我们球队的积分和净胜球是可以计算出来的,根据胜负平场次计算积分,根据进球和失球计算净胜球。所以我们可以将计算积分和净胜球定义成方法。

用于描述语法和类结构,因此下面这个类的写法极其不规范,暂时这样先用着,后面会做专门说明。

类的结构

上图中我们从上往下看,首先是类的定义,这里要注意一下,类的首写字母一定要是大写的Team。再往下,成员变量的首写字母是小写,如果只有一个单词,直接小写单词即可比如name,如果多个单词组成,第二个单词开始,首写字母大写,goalDifference,这就是驼峰结构。这里我们还需要注意的一点就是命名方式,命名有个最大的重点就是要一看就懂,不要追求英文单词的准确性和语法,我们是写代码,不是学英语。比如我们这里写了个进球的变量叫goal,百度了一下,失球叫fumble ,但是对于普通人来说,这个词看上去就懵了,所以这样写没错,但是不建议,像我这样写就行了,失球loseGoal,一目了然。虽然单词和语法层面来说是错的,但是理解方便即可。

再看方法,方法的名称也是一样用驼峰法,calculateGoalDifference,三个单词从第二个开始首写字母大写。方法是用来定义类的行为的,就是说他是个动作,所以我们最好使用动词来定义它。比如我这里就用calculate 计算来修饰GoalDifference 净胜球,这样读到这个名字就知道这是一个方法。

最后看构造器,好吧,你是看不到的....因为如果你不自己写构造器,每个类会定义一个默认的隐身的构造器,只是你不知道你用过他而已。

对象的创建

其实上面这个图里面最重要的不是成员变量,不是方法,而是

Team team = new Team();

这一句话,这句话博大精深,里面包含了类,对象,构造器。

创建对象

前面讲数组的时候我们就说过new这个关键字,这里的new在内存里面干的活和创建数组的时候是一样的,team变量在栈,对象在堆,team的值是个地址,指向堆里面的对象。我们千辛万苦终于创建好了对象,那么他用来干嘛的?

1.调用成员变量。2.调用方法

调用

上图就是调用成员变量和调用方法。

我们观察上面的代码,会发现一个问题,我们创建了对象以后,需要一个个的调用成员变量,设置值,这样感觉好累,为什么要这样做?这跟我们那个隐身的默认构造器有关了。我们知道一个类是必须有一个构造器的,如果自己不写构造器,那么就是使用这个什么也不干的构造器,既然这个默认构造器啥也没干,我们创建出来的对象,就是个空对象,就是说我们的对象里面的属性全是没有赋值的,如果我们手写构造器,在创建对象的时候,就把对应属性的值传去的话,这样创建出来的对象,属性就是有值的。

画复杂了

这张图不小心画复杂了点,主要是里面知识点比较多,我们按照顺序一个个来看。

我们在学习的时候,要明确一点,程序的入口在main方法,程序执行从main方法开始,所以我们先看1,这里其实就是一句话,new了一个对象,然后使用了自己写的构造器,没有用那个会隐身的构造器。我们的构造器可以同时存在多个,但是他们的参数是不能相同的,比如我们创建了一个构造器,他有7个参数,然后手写了一遍默认构造器,没有参数,这样是可以的。只要我们写了自己的构造器,必须手写一遍默认构造器。

2参数必须一一对应好,构造器里面参数第一个是名称,第二个是场次数量等等,我们在new对象的时候,传进去的参数必须也是按照这个顺序,不能出错。

3参数赋值,成员变量属于对象,当我们使用构造器创建对象的时候,成员变量会被“打包”跟着这个创建出来的对象,所以我们需要在创建对象的时候,就给属性赋值的话,就靠这一步了,我把创建对象的时候输入的参数,传入了成员变量,这样,当这个对象创建出来的时候,他的属性就有值了。然后就是当参数与成员变量重名的时候,需要使用this这个关键字,this.name = name,表示我是将参数里name的值传递给了成员变量里面的name,这样程序才能正确的执行。

4除了默认构造器会隐身,其实我们的 this 关键字也会隐身,在我们的构造器中调用本类的方法的时候,可以省略前面的this。在我们的方法里面如果成员变量和参数没有重名,也可以省略成员变量前面的this。

最后看打印结果,我们只写了一行创建对象的代码,创建出来的对象里的属性都是有值的,并且都跟我们计算好结果了。这就是自己手写构造器的好处。

好了,本章讲这么多,小码继续加班了...

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180710G0G02V00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券