Java学习笔记20180404

2018-04-05  本文已影响100人  半坡城主

今天继续练习视频教程给出的题目和代码,并且就编译过程中遇到的问题加以总结。今天的主要内容是针对Class,Method,Constructor,Override和Get,Set方法,我会放一些截图来进行说明。

1.题目概述

先说下今天的题目,

1.针对银行帐户这一对象新建一个类,然后定义存钱和取钱两种方法,并显示结果。

2.在银行帐户类的基础上新建一个子类,定义为信用卡帐户,然后增加信用卡额度,还款利率和还款期限这三个属性。

看起来题目很简单,但要想避开Bug,一方面需要细心,一方面需要有整体的设计思路。我第一步是在纸上写出银行帐户需要记录哪些信息,它相当于数据库系统中的一条记录,这条记录应该包含哪些字段,我想到的有卡号,用户名,手机号,邮箱,余额,用户星级这6条。

2.解题步骤

第一步是新建Class,并且给这6个字段设定相应的数据类型,余额使用Double,用户星级使用int,其余的均使用String。很简单吧!

第二步是建立几个构造函数(Constructor),我专门到网上搜了下Constructor的用法和意义。理解如下:

对于Java来说,需要先声明,后使用,先创建类,再创建类的对象,在对对象进行实际操作前,我们还要进行对象的初始化,就是要给它赋值。但可能要对许多对象批量赋值,或者说,有些对象的某些属性是相同的,比如默认银行帐户的星级是3,我们就可以使用构造函数将这一条固定下来。

因为构造函数只是为了类的对象的初始化,在对象生成之前就已存在,

1)因此它没有static修饰符,也没有void修饰符

2)构造函数的名称应与类保持一致,以方便编译器Compiler识别。

3)构造函数可以不只一个,假设一个场景,你去银行办一张新卡,职员热情地给了你一张表格要填写,有些必填项,有些选填项,每个人填写的栏目数可能都不一样,类似地,构造函数在将类的对象初始化时,也就符合这种设定。即允许只输入6个字段中的某几个,其余字段的内容可以在后面赋值,也可以更改字段的顺序。

Google告诉我,这也是Java的多态性的一种体现。

比如,我就自己写了3种构造函数,第一种只需要依次填写卡号,用户名,电话号码和邮箱,第二种只要填写卡号,第三种是6个字段全部要写。

Constructors for Class

紧接着,我们需要考虑的问题是,如何对对象的属性进行读写,类似于数据库的四大基本操作“增删改查”一样,我们完成了新建对象和初始化,即完成了“增”的动作,那对对象的读与写就相当于改和查。这么一想,许多事情的原理都是相似的,互通的。

Java针对类提供了Get和Set这两种方法,Get用于读取,Set用于写。这里还要提到封装的概念,我们手工制造了某一种类,但我们不希望也不需要别人知道它的内部的工作原理,就比如你拿万用表去测电阻,你只要知道用两个探针去接触物体就行,不需要知道万用表测电阻是怎么测的。类似的,Java说的封装就是这个意思,它是一个黑匣子,只提供了少数的几个端子用于和外部联系。简单概括就是“隐藏细节”。

而Get和Set就相当于万用表的两个探针。IDE软件IntelliJ IDEA提供了方便地创建Get和Set的方法,在所要创建的对象名称上使用鼠标右键,打开菜单,选择Generate,然后选择Getter and Setter即可。针对上述6个字段,我们可以全部设置读写权限,也可以只开放其中一部分。在编写代码的时候,要把自己想象为管理员,想象为God,你需要全权控制这段程序。(这里少一张斜眼笑的微信表情)。

Get and Set in IntelliJ IDEA

写到这里,我们再回到原题目中去,我们还需要对对象的属性进行操作,题目中只对帐户余额Amount这个字段进行修改,存钱和取钱。

存钱很容易,假设要存的钱为Fund,那么Amount+=Fund;即可。

但取钱要考虑到一个问题,取的钱数大于帐户余额,这时应该拒绝请求,因此需要增加一个if条件判定。如果二者两减仍大于0,则允许操作,并给出帐户余额Amount-=Fund;

计算结果精度丢失

我在实际Run程序的时候,还发现一个问题,两个Double数值Amount和Fund相减,结果小数点后多了许多位,我Google后发现,这是Doulbe数据类型的一个固有问题,因为二进制表示小数只能无限接近,不能精确表示,就好像10进制中无法精确表示1/3一样,二进制中能精确表示1/2,但无法精确表示1/10.

我也在本视频课程的Q&A问答区域看到有其他同学问到这个问题,老师只是作了解释,但没有给出解决方法,我搜索后看到,有人建议使用BigDemical类来提高精度,但好像也没法修复这个问题,我就采用了四舍五入的方法,保留3位小数。实现后的截图如下:

 四舍五入法保持结果准确

在修复完这个错误后,基本上题目的第一部分已经解决了。接下来是创建信用卡这一子类,继承父类的内容,并新增3个字段而已。

这里涉及到今天笔记的最后两个内容,Override重写与Overload重载。当然就有人问这两者的联系和区别是什么了。Override是子类继承父类的属性和方法,并将方法赋予新的内容。而Overload就是直接调用父类的方法。

Override and Overload

最后,希望大家继续点赞支持,我会继续更新的。

上一篇下一篇

猜你喜欢

热点阅读