20145233 《Java程序设计》第3周学习总结
教材学习内容总结
类与对象
Java中有基本类型与类类型两个类型系统,第三章已经学习过了基本类型,第四章主要讲解了类类型。使用Java撰写程序几乎都是在使用对象(Object),要产生对象必须先定义类(Class),对象是类的实例。下面我先举一个关于类类型的代码:
class Clothes{ String color; char size; } public class Field{ public static void main(String[] args){ Clothes sun = new Clothes(); Clothes spring = new Clothes(); sun.color = "red"; sun.size = 'S'; spring.color = "green"; spring.size = 'M'; System.out.printf("sun (%s, %c)%n",sun.color,sun.size); System.out.printf("spring (%s, %c)%n",spring.color,spring.size); } }
在这个Field.java文件中,定义了两个类,一个是公开的(public)的Field类,所以文档主文档名必须为Field,另一个非公开的Clothes,在第二章中我们有学到,一个原始码中可以有多个类定义,但只能有一个是公开类的,且文档中的主文档名必须与公开类名称相同。
使用标准类
目前为止我们的程序都是比较简单的,变量值都是死的,没有办法接受我们的输入,所以在这里我们就可以使用标准类的代码语句来解决问题。
1.使用java.util.Scanner
import java.util.Scanner;public class Guess{public static void main(String[] args){ Scanner scanner = new Scanner (System.in); int number = (int) (Math.random() * 10); int guess;do{ System.out.printf("guess a number :"); guess = scanner.nextInt();}while(guess != number);System.out.println("you are right!"); }}
2.使用java.math.BigDecimal
第二章有一个问题就是1.0 - 0.8的结果是多少?那是我们会以为答案是0.2,其实不是这样的,这是因为Java使用分数与指数来表示浮点数,所以导致计算时无法精确表示,造成运算上的误差。故我们可以使用java中的java.math.BigDecimal来解决。
import java.math.BigDecimal;public class DecimalDemo{public static void main(String[] args){ BigDecimal operand1 = new BigDecimal ("1.0"); BigDecimal operand2 = new BigDecimal ("0.8"); BigDecimal result = operand1.subtract(operand2); System.out.println(result); }}
基本类型打包器
要让基本类型像对对象一样操作,可以使用Long、Integer、Double、Float、Boolean等类打包基本类型,这些类就是打包器,除了使用new创建基本类型打包器,之外,从J2RE5.0之后提供了自动装箱和拆箱功能。
数组对象与数组复制
1.数组在Java中就是对象。
2.在Java中,数组一旦建立,其长度就已经固定了,这一点也是和C语言所不同的地方。
3.在Java中可以使用System.arraycopy()的方法来进行数组值的复制,它会使用原生方式复制每个索引元素,比使用循环更快。在JDK6以上的版本中,还有个更方便的Arrays.copyOf()的方法,能够帮你建立新的数组。无论System.arraycopy()还是Arrays.copyOf(),用在类类型声明的数组时,都是执行浅层复制。
字符串对象
1.字符串本质是打包字符数组的对象,是java.lang.String类的实例。
2.要想比较字符串实际字符内容是否相同,不能使用==,要用equals(),这一点前面也提到了。
3.字符串对象一旦建立,就无法更改对象中的内容,使用+会产生新的String实例,不要将+用在重复性的连接场合。
4.使用javac指令没有指定-encoding选项时,会使用操作系统默认编码。
查询API文件
老师上课有举例子关于API的,我们需要现在自己的个人电脑中下载API。
并且老师提供了一篇博客供我们学习: -封装
Java学习笔记中,对于封装有了一个定义:构造函数实现对象初始化流程的封装,方法封装了操作对象的流程。java中还可以使用private封装对象私有数据成员。封装目的的主要就是隐藏对象细节,将对象当做黑箱进行操作。
this关键字
除了被声明为static的地方外,this关键字可以出现在类中的任何地方,在对象建立后为“这个对象”的参考名称。目前我们看到的应用,是在构造函数参数与对象数据成员同名时,可以使用this加以区别。
注意:this()调用只能出现在构造函数的第一行。static类成员
被声明为static的成员,不会让个别对象拥有,而是属于类。我们也是通过类名称与“.”运算符,就可以取得static成员。我们一直在用的System.in与System.out中的in与out都是static成员。
static成员属于类所有,将类名称当作名称空间是其最常使用的方式。正是由于static成员是属于类,而非个别对象,所以在static成员中使用this会是一个语意上的错误。有些情况没有写this,但是隐含了this的意义在里面,因此也会发生编译错误。
.class被JVM加载后,默认就会执行static区块。在JDK5之后,新增了import static语法,可以在使用静态成员时少打几个字。我们可以通过import来偷懒,偷懒过头就会出现问题,要注意名称冲突问题,有些名称冲突,编译程序可通过以下顺序来解析:
1.局部变量覆盖
2.成员覆盖
3.重载方法比较
教材学习中的问题和解决过程
1.乱码问题
在之前的那一章学习中,我们在计算的时候遇到了乱码问题,以为乱码计算机没有办法读取里面的内容,我在向同学请教后,学到了一行代码-ebcoding UTF-8
,在第四章的末尾我终于搞清楚了这是为什么。
2.==与equals的问题解决
在这周的一个代码中我没仔细看书,将.equals下意识的写成了==,结果我的程序在运行的时候出现的结果和书上的不一样,我一直觉得没有出现编译错误就是没有问题,这又反了在学习C语言时的问题,其中也会不出现编译错误但是在执行时就会出现。这个==和.equals在书中还是重点强调的,我还是不够仔细,没有真的理解里面的内容,我在这里在做一个总结。
(错误的代码编写)1.==
==:使用在对象类型,是比较两个名称是否参考同一对象。
2.equals
equals:它用在定义两个对象的内含值是否相同。
代码调试中的问题和解决过程
我的代码在编写的过程中因为对定义的不完全理解,导致了一些错误,就是上面这个==和equals的问题,使得程序无法正确的像我所希望的那样进行,在仔细看书并且重新改写代码之后,程序可以良好的运行。
正确的代码编写:其他(感悟、思考等,可选)
这周的学习任务是相当的重,相比前几周有了质的变化,但是在这周的学习中我感到十分充实,没有了以往在大学里学不到什么实用性知识的困惑,我的父母这周打电话给我,问我周末有没有什么打算出去玩,但是因为这学期的Java是自学为主,我的周末几乎都用在学习上面了,虽然没有出去,但是这几天里我学到的知识让我觉得有很大的收获,虽然学习的过程是长久的,但是在这段时间内的学习,让我收获颇深,学到知识的成就感还是很足的。
代码上传
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 4000行 | 24篇 | 400小时 | |
第一周 | 150/150 | 2/2 | 15/15 | |
第二周 | 200/350 | 2/4 | 20/35 | |
第三周 | 350/700 | 2/6 | 30/65 | |
第四周 | / | / | / |