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();有什么区别?
- 我在网上百度了一下,搜索结果如下:
- 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出现了不等于的情况。
解决方案
在输入课本p145不定长度自变量的代码后,编译时都没有问题,在运行时出错。
-解决方案
在解决时,上网查了一下,没有找到合适的解决方法。(未解决)
- p85 Field2.java: 构造方法的使用,构造方法决定了生成对象的方式。构造方法的参数与类成员变量一样,通过this区分。
结果:
加一行
Clothes2 autumn = new Clothes2();
能编译、运行吗?为什么?
结果:
- p88 DecimalDemo.java: BigDecimal
出现错误如下:
解决过程:
代码托管
代码提交过程截图:
代码量截图:
脚本截图
上周考试错题总结
- 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: 访问对象的成员变量
在自己输入代码运行后有了更深刻的理解。程序中建立了两个实例,并声明为sun 与 spring 两个名称来参考,接着将sun绑定对象上的color与size分别指定为red与s,将spring的color与size指定为green与M,最后分别显示sun与spring的数据成员值。这个跟c语言中的结构体相似。
运行结果:
p86 Guess.java: Scanner
运行结果
类比C语言的scanf。
p97二维数组的实现
p98使用java.util.Arrays的fill()方法设定新建数组元素。
p105利用Array.copyOf()的方法,不用另行新建数组。
拷贝结果:
p106浅层复制
执行结果和我们预期的不同:
结果是yellow。这是因为循环仅将c1索引处所参考的对象也给c2来参考,没有实际复制出clothes对象。
p107深层复制
p112
利用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就接近了。
计划学习时间:32小时
实际学习时间:38小时