前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >写代码太难 送快递也不错啊

写代码太难 送快递也不错啊

作者头像
用户5745563
发布2019-07-04 11:44:26
2670
发布2019-07-04 11:44:26
举报
文章被收录于专栏:码思客码思客
java零基础入门-面向对象篇(四) 类和对象 (中)

要把类和对象说清楚,一定要弄清楚他们的联系,他们由什么组成,每个组成部分有什么用,怎么用。

这里有个很关键的东西,叫this,我们上篇文章也说过,但是他的存在经常让初学者云里雾里,好像懂了,会用了,心里却又没底,特别是后面还有个关键字叫 super ,这两兄弟经常存在于各种面试题里面,搅的人心神不宁,这次我们来把它说清楚,讲明白。

再说 this 关键字

this的用法很多,搞清楚本质,问题就迎刃而解了,this的本质是什么?this总是指向调用该方法的对象。这句话描述的十分准确,但是理解起来十分困难,我们来分解一下这句话 this (总是) 指向 (调用该方法的) 对象 ,看见没,this指向的是一个对象!指向是个什么意思?还记不记得我们前面说的,栈里面的变量指向堆里面的对象,变量保存的是堆里面对象的地址,那么this也指向对象,说明this里面保存的也是地址?确实,this里面保存的还真是个地址。

我们继续看 指向 (调用该方法的) 对象 这句话是什么意思。this指向了一个对象,那么它指向的是哪个对象呢?调用这个方法的对象,哪个对象在调用方法,this就指向哪个对象。OK~完整的理解一下这句话,哪个对象在调用方法,this就保存哪个对象的地址。看见没,我们理解一句话,搞得像是在破案一样,抽丝剥茧,最后找到真相。其实只有当我们了解了问题背后的本质的时候,才能找到问题的答案。

除了调用方法,this还可以调用构造器和成员变量。理解了上面的那句话,这里就很好理解了,因为this保存的是对象的地址,this就可以“代替”这个对象,这个对象能调用的,this都可以调用。

this调用

要注意的是,其实上面这个写了this的地方,也是可以省略this的,我写出来只是方便大家观察。其实我们在一个类里面,成员之间互相调用,通常来说都是可以省略this的。但是构造器里面的this就有点不同了。

对于构造器里面的this,是指正在被创建的那个对象。

构造器里的this

this 关键字,其实用的很少,因为要用它的地方都可以省略它...而构造器里面其实一般使用默认无参构造器就够了。工作中用this最多的地方就是局部变量和成员变量重名的时候,用this加以区别,然而,这个过程其实编程工具可以帮我们一键生成,不需要我们敲键盘。但是,面试题里出现率比较高,所以还是弄清楚比较好。

我们上面说了,调用成员变量和方法的时候,会有一个this在前面,不管你写或不写,它都在那。但是还有一种成员变量和方法,它前面不是隐藏了this,而是真的没有this,他们就是静态变量和静态方法。

静态变量

静态变量就是在定义的时候被 static 修饰的变量。由static修饰的变量和方法都属于类,不属于对象。

解释这个问题之前,我们首先来看一个老熟人 —— main 方法。我们前面没有介绍对象的时候,都是直接运行mian方法,而没有创建任何对象,而我们介绍对象的时候又介绍对象调用方法,这是为什么?因为我们的main方法是静态方法,只要有类,就可以运行,因为静态方法属于类,不属于对象。我们以前在练习的时候使用了main方法,可是对main方法前面一堆修饰符缺没有任何介绍,现在我们的知识储备已经足够了,我们来好好讲一下main方法。

main方法

1.public 是访问修饰符,除了public 还有 protected , default, private ,这里先混个眼熟,具体后面说。

2.static 这个是本篇主角,用来标记该方法是静态方法。

3.void 是方法的返回值,void表示这个方法不需要返回值。

4.mian 是方法名,此方法叫main。

5.Stirng[] args 是方法参数,表示main方法可以接受 String 数组类型的参数,main方法的参数是java的运行参数。这个了解即可。

什么是属于类?什么是属于对象?

属于类就是直接被类调用,属于对象就是直接被对象调用

类调用

我们看到,我们的main方法是静态方法,如果在main方法直接调用非静态的成员变量或者方法是直接报错的,而我们调用静态成员变量是直接使用类名去调用。

我们为什么需要静态的变量和方法?

其实我们在写代码的过程中,会遇到一个情况,那就是有一些方法是需要重复使用的,比如计算日期,字符串的格式化等等,这种方法我们称为 “工具方法”,我们用一个工具类来封装这些方法,这种类有个特点,我们并不需要用它来创造对象,再去使用方法,而是直接使用这个工具类中的方法即可完成任务。我知道说了半天,肯定有同学还是不懂,这次我们来送个快递。

比如我们经常上网购物,我们会收到很多包裹,在我们的卖家发货的时候会把东西打包,这个场景我们有两个类,一个是包裹,一个是包装的工具胶带。我们的包裹每个都不一样,里面可能是不同的商品,也可能是不同的商品数量,但是我们将商品打包后,都会用胶带这个工具来封包裹,胶带就可以做成一个工具类,因为我们不管包裹里面有多少东西,东西是什么,最后胶带做的操作都一样。

包裹

首先看包裹,包裹是类,实例是装好各种商品的包裹,包裹的大小也可能不同。比如我们的包裹有签收人,大小,商品数量这三个成员变量,每个实例的签收人,大小和商品数量都是不同的,买了一个商品的就是小包裹,买了几个商品的包裹就大一点,所以我们要将这三个变量设置成普通的成员变量,让他们的值跟着实例变化。包裹还有一个方法是收包裹,“多么激动人心的时刻啊”~

胶带

再看胶带,我们打包好包裹以后就要贴胶带了,我们的胶带有一个成员变量,叫贴几次,还有一个方法叫贴胶带。一般贴包裹都是横着贴一圈,再竖着贴一圈,这样就行了,每个包裹不管大小,里面装的什么,都跟我贴胶带没啥关系,所以这个贴几次的变量值就是2。正因为他跟对象没有关系,所以我们完全可以把他设计成属于类的成员变量和方法,不需要实例,直接使用类来操作。

有同学会问,胶带是个类也可以实例化啊,也可以有很多种胶带啊,我来说给你听,透明胶带,不透明胶带,单面胶带,双面胶带...我也可以实例化其中一种来贴箱子啊,为啥非要用类的方法?说的很对,胶带确实还可以实例化,只要将static修饰符去掉,但是,我们这个具体的场景里其实只需要把箱子贴两次就够了,不关心用什么胶带去贴,只要是胶带就行,我们只需要关心贴这个过程,具体你用什么来贴都行。所以我们需要的只是胶带这个类的“贴”方法,而不需要具体到某种胶带的“贴”方法。而且在使用过程中会带来很大的便利,不用去实例化对象,何乐而不为?工具这个概念,就是拿来即用,用完就扔,下次再捡起来继续用...

再来看代码,首先是胶带的类

胶带类

在理解这个知识点的时候,一定要弄清楚一个关键的地方,那就是静态变量和方法属于类不属于对象,如果我们使用对象的方法一定要使用对象去调用,使用类方法用类调用。其实我们写代码的时候会发现,如果把胶带这个类实例化,是可以用胶带生成的对象去调用胶带的静态变量和方法的,但是强烈不建议这么做,这样做会显得很业余,就好像你在自己的脸上写了几个字——“其实我什么都不懂”,所以最好不要这么干。

再来看包裹的类

包裹类

包裹类里面是非静态的成员变量和非静态方法,因为他们要生成不同的实例对象,所以不能设计成静态成员和方法。而胶带不管你传来的对象是大傻子的包裹还是二愣子的包裹,他都干同样的活,所以可以设计成静态成员和方法。嘴巴说干了。。。希望各位能够理解。

前面我们说了一句话

有一种成员变量和方法,它前面不是隐藏了this,而是真的没有this,他们就是静态变量和静态方法。

为什么?如果你真的理解了this和static,就不用我多说了。

emmmm~~~考虑再三,我还是说吧~ this指向的是对象,static变量不属于对象属于类,所以static修饰的不管是成员变量还是方法,前面都没有this,因为this只跟对象玩,你不属于对象,抱歉~不跟你玩~

类和对象的生命周期

生命周期,是指一个东西从诞生到结束的一个完整的过程,比如一个人从生到死就是一个完整的周期,而我们的软件也是一样,它们也是有生命周期的,比如类和对象。

生命周期

每一个时期他们可以做的事都不一样,比如我们在刚出生的时候,肯定不会有哪个傻子跑来问,“哇,好可爱啊,你叫什么名字啊~”,因为刚出生的时候啥也不知道,怎么可能回答问题。我们的类和对象也是一样,在生命周期的不同阶段可以做不同的事。

这里我们讲类的生命周期和对象的生命周期是抽象的概括,以后我们知识积累多了我们再展开讲。

类和对象生命周期

从生命周期的角度看,我们的静态变量和方法在加载类的时候就可以用了,而非静态的变量和方法必须要有类的实例,才可以使用。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-07-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 码思客 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档