20155232 2016-2017-3 《Java程序设计》第3周学习总结

20155232 2016-2017-3 《Java程序设计》第3周学习总结

教材学习内容总结

  • 第四章 认识对象

1.对象(Object):存在的具体实体,具有明确的状态和行为。

2.类(Class):具有相同属性和行为的一组对象的集合,用于组合各个对象所共有操作和属性的一种机制。

类定义使用class关键词。

新建对象使用new关键词。

在构造函数中,将某个参数的值指定给某个对象的的成员时,对象用this表示。

两个标准类:

java.util.Scanner
java.math.BigDecimal

Scanner类简化了Java的输入,告诉编译程序接下来想偷懒。scanner的

nextInt()

方法会查看标注输入输出中,有没有输入下一个字符串。scanner对应每个基本类型,都会有对应的nextxxx()方法。

由于浮点数误差,别用==直接比较浮点数运算结果。使用

java.math.BigDecimal

类。BigDecimal中提供的方法可以进行加减乘除等运算。

小提示: 通过调用equals==()比较是否相同。

在操作对象时,=是用在指定参考名称参考某个对象,而==是用在比较两个参考名称是否参考同一对象。!=是比较两个是否没参考到同一对象上。

3.基本类型包装

int-Integer

long-Long

byte-Byte

float-Float

double-Double

...

4.Java中,数组是对象,要声明数组并做初始值。如果存取超出范围,则会

ArrayIndexOutOfBoundsException

的异常。数组的length属性可以取得数组长度。

小提示:在二维数组中,可以利用:数组名称[x].length得知每列有几个元素。

可以使用

java.util.Arrays

的fill()方法来设定新建数组的元素值。

易错点 :在类类型建立的数组中,例如:

Integer[] scores = new Integer[3];

建立了0个对象而不是三个!因为这个片段的写法建立的数组每个索引都是参考的null。

Integer[] [] cords =new Integer [3][2];

中还是建立了0个实例,因为有3个Integer类型的索引,分别参考至长度为2的Integer一维数组对象,而每个一位数组的索引都参考null,所以答案还是0个。

5.使用

System.arraycopy()
Arrays.copyof()

使用原生方式复制每个索引元素。其中

System.arraycopy()

的5个参数分别是来源数组,来源起始索引,目的数组,目的起始索引,复制长度。而第二个方法

Arrays.copyof()

则不用另行新建数组。且第2个参数是指定建立新数组的长度。

注意:实际仅仅将第一个数组参考的对象,也给第二个数组来参考,并没有实际复制,仅仅是浅层复制。而深层复制就是将数组索引参考的对象分别指定给另一个数组。

6.使用length()取得字符串长度,charAt()指定去的字符串中某个字符。使用toUpperCase()将小写转为大写。还可以使用+运算来连接字符串。

7.在java中为了效率,以""包括的字符串,只要相同,无论在程序代码中出现几次,JVM都只会建立一个string实例,并在字符串池中维护。

再次强调:
想比较对象实质是否相同,不要使用==,使用equals()。对比较字符串也是同样。

8.在java中,字符串一旦建立,就无法更改对象中的任何内容。如果使用+连接字符串,会变成建立java.lang.StringBuilder对象。使用append()来进行左右两边的附加。
注意使用+连字符会产生新的string的实例,不要用在重复性的连接场合,例如循环,递归,因为会频繁产生新的对象,造成负担。

9.查询API文件

  • 第五章

1.在老师的学习指导中对封装进行了解释

封装(Encapsulation)实际上使用方法(Method)将类的数据隐藏起来,控制用户对类的修改和访问数据的程度,隐藏对象细节,将对象当作黑箱进行操作。

2.流程如下:

通过构造方法(构造函数)封装初始化流程

通过成员方法(函数)封装操作

通过成员变量封装数据

注意在定义方法后,方法若会返回值,必须在方法前声明返回值的类型。

提示在java命名习惯中,方法名称首字母是小写。

3.信息隐藏

对象内部的状态被保护起来了,不会被与该对象沟通的对象直接修改。

对象内部特征的变化不会改变与其他对象沟通的方式

如果有些数据是类所私有,在java中可以使用private关键字定义。如果想要修改则必须经过你定义的流程。

在java命名规范中,取值方法的名称形式是固定的,也就是以get开头,之后接上首字母大写的单词。

4.public权限修饰

如果想在其他包的类程序代码中存取某包的类或对象成员,则该类或对象成员必须是公开成员,在java中要使用public加以声明。

可以声明类为public,表示是个公开类,可以在其他包的类中使用。可以在构造函数上声明public,这表示其他包的类中可以直接调用这个函数。同样适用于方法。

提示编译程序会在没有撰写任何构造函数时,自动加入默认构造函数,所以在没有撰写时,也可以以无自变量的方式调用构造函数。只有编译程序自动加入的构造函数,才称为默认构造函数,如果自行撰写无参数,没有内容的构造函数,就不称为默认构造函数了。

5.方法重载

参数类型和个数不同。

调用的方法名称vauleOf(),根据传递的自变量类型不同,会调用对应的方法。例如:String.vauleOf(10),因为10是int型,所以会执行vauleOf(int i)版本。

注意返回值类型不可作为方法重载依据。

6.在java中,this()代表调用另一个构造函数,至于调用哪个构造函数,视调用this()时给的自编量类型与个数而定。

注意this()调用只能出现在构造函数的第一行。

7.被声明为static的成员,不会让个别对象拥有,而是属于类。可以通过.运算符取得static成员。同样适用于方法。

注意由于static的成员是属于类,而非个别对象,所以在static成员中使用this()会产生语义上的错误。

8.不定长度自变量

要使用不定长度自变量,声明参数列时,要在类型关键字后加上...。使用时,方法上声明的不定长度参数必须是参数列最后一个。

9.内部类

在类中再定义类。

10.传值调用

java当中只有传值调用。

教材学习中的问题和解决过程

  • Java中,next();和nextLine();有什么区别?
  • 我在网上百度了一下,搜索结果如下:
    image
  • java程序中的parselong()方法有什么用?
  • 是将一个字符串转换成数字的。
    比如字符串
String str="12345";

现在你想把得到str表示的数字12345。那么就可以用

parseLong(String str)

方法转换,返回值就是long类型的数字12345,除parseLong以外,还有

Integer.parseInt

Double.parseDouble

等方法也是同样的功能,只是返回值类型不同而已。

  • op1.add(op2).add(op3).equals(result)是什么用法?

  • 调用add()方法得到它们的和,再调用equals()进行判等。

代码调试中的问题和解决过程

  • 在试验书上p87页的代码时,0.1+0.1+0.1出现了不等于的情况。
    image
    image

  • 解决方案
    image

  • 在输入课本p145不定长度自变量的代码后,编译时都没有问题,在运行时出错。
    image
    image
    -解决方案

在解决时,上网查了一下,没有找到合适的解决方法。(未解决)

  • p85 Field2.java: 构造方法的使用,构造方法决定了生成对象的方式。构造方法的参数与类成员变量一样,通过this区分。

image

结果:image
加一行

Clothes2 autumn = new Clothes2();

能编译、运行吗?为什么?

结果:image

  • p88 DecimalDemo.java: BigDecimal
    image
    出现错误如下:
    image

解决过程:
image

代码托管

  • 代码提交过程截图:
    image

  • 代码量截图:
    image

  • 脚本截图
    image
    image

上周考试错题总结

  • 5.判断: Java中, 数字235.00的类型是float. (X)

原因:对于编译器来讲,如果只写上一个常量的小数,会默认为double型,就如上题,所以需要在定义float类型时必须加f。

  • 6.~0b1011的十进制值是(-12)

原因:~表示位运算求补码。0000 1011 取反:1111 0100 (负数),因为负数存储以补码存,所以补码为1000 1100(-12)

  • Java中,非零数字等价于true.(X)

原因:注意在c语言中非0即为真,而在java中只有1为真。

  • 0.123 == 1.23e-2 (X)

原因:粗心大意,应该是1.23e-1.

  • 0x10%9 的结果是( 7 )

分析:10转换成10进制为16,9为9,所以余数为7。

  • 0x10&9 的结果是(0)

分析:10(x)=0001 0000(b)
9(x)=0000 1001(b)
按位与之后为0.

  • 运行p69 Odd.class的命令为(java cc.openhome.Odd)。

原因:没有写cc.openhome直接写的java Odd。

感悟心得

  • 对教材感悟

在学习第四章时,觉得前三章比起来明显难度有所增加,也体会到了java和c语言面向的不同。java面向对象的概念有了大概的轮廓。区分了基本类型和类类型,了解了对象与参考的关系,也从打包器认识了对象,以对象观点看待了数组,认识了字符串的特性。在学习第五章时,感觉这部分好难,和c语言大不相同。认识了封装的概念(以前从来没有接触过)与实现。了解了定义类,构造函数与方法,感觉这三个有点混淆。在编写代码的过程中很多语法细节不知道如何修改和所代表的意思。还了解了方法重载的优点,static成员和不定长度自变量。总的来说这周学习的内容有点难度,有的地方看不太懂,会上网搜索查资料等等。但是感觉理解还是不到位,在实践上还是相差甚远。需要多加练习和看书。

  • 对考试感悟

在这次考试中,对计算进制转换掌握的不够老练,还会犯很多低级错误,导致丢分。对位运算符逻辑运算符有些混淆。对java程序语言掌握的不够老练,换了题目就不会做了。还需要多加练习。

  • 课本中代码的部分展示与思考

p84 Field.java: 访问对象的成员变量
image在自己输入代码运行后有了更深刻的理解。程序中建立了两个实例,并声明为sun 与 spring 两个名称来参考,接着将sun绑定对象上的color与size分别指定为red与s,将spring的color与size指定为green与M,最后分别显示sun与spring的数据成员值。这个跟c语言中的结构体相似。
运行结果:
image

p86 Guess.java: Scanner
image
运行结果
image
类比C语言的scanf。

p97二维数组的实现
image
image

p98使用java.util.Arrays的fill()方法设定新建数组元素。
image
image

p105利用Array.copyOf()的方法,不用另行新建数组。
image
拷贝结果:
image

p106浅层复制
执行结果和我们预期的不同:
image
结果是yellow。这是因为循环仅将c1索引处所参考的对象也给c2来参考,没有实际复制出clothes对象。

p107深层复制
image
image

p112
image
image
利用StringBuilder每次append()调用过后,都会返回原有StringBuilder对象,只产生了一个对象,进行一次输出。

学习进度条

代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
目标 5000行 30篇 400小时
第一周 15/15 1/1 23/26
第二周 208/240 2/2 35/38
第三周 376/584 3/3 32/38

尝试一下记录「计划学习时间」和「实际学习时间」,到期末看看能不能改进自己的计划能力。这个工作学习中很重要,也很有用。
耗时估计的公式
:Y=X+X/N ,Y=X-X/N,训练次数多了,X、Y就接近了。

参考:软件工程软件的估计为什么这么难软件工程 估计方法

参考资料

posted @ 2017-03-12 13:03  短爪爪爪  阅读(186)  评论(0编辑  收藏  举报