20155339 2016-2017-2 《Java程序设计》第3周学习总结
20155339 2016-2017-2 《Java程序设计》第3周学习总结
教材学习内容总结
第四章 认识对象
类与对象
1.定义类时使用class关键词再加名称,例如
class Clothes
,新建对象时需要用new Clothes
。若要将c1名称参考至新建对象,则可以Clothes c1 = new Clothes()
,c1是引用,在栈上,new Clothes()在堆上生成对象,c1可以近似看成指向对象的指针。通过程序来学习,程序代码链接在这个程序中有两个类,一个是公开的Field类,另一个是非公开的,此处需要注意一个原始码中可以有多个类定义,但只能有一个是公开类,并且文档中的主文档名必须与公开类名称相同。该程序运行结果如下
构造函数
在上面的代码中可以看到当为个别对象指定数据的代码是类似的,可以通过构造函数来将这一步骤一并进行。例如,代码链接,改程序运行结果与上面的例子相同
分析该代码
class Clothes2
{
String color;
char size;
Clothes2(String color, char size)
{
this.color=color;
this.size=size;
}
}
这一部分完成了定义构造函数,并指定将某个参数的名称指定给这个对象的某个成员。
Clothes2 sun = new Clothes2("red",'S');
Clothes2 spring = new Clothes2("green",'M');
这一部分是使用指定构造函数建立对象。
标准类
两个基本的标准类: java.util.Scanner
以及 java.math.BigDecimal
。
1. java.util.Scanner
可以接受用户的输入,可以通过import java.util.Scanner
告诉程序你想偷懒,这样不用每次使用Scanner
都输入前面的java.util.Scanner
。Scanner
的nextInt()
方法会看看标准输入中有没有下一个字符串,有的话会尝试将之剖析为int
型。next()
是直接取得上一个字符串,nextLine()
是取得用户输入的整行文字,练习书上的代码代码链接,结果如下
对书上的例题进行改编,进行一个小练习, 代码链接 ,得到结果如下图
2.关于 java.math.BigDecimal
Java遵守IEEE 754浮点数运算,使用分数与指数来表示浮点数,因此容易产生误差,那么要得到更好的精确度,我们就需要使用 java.math.BigDecimal
了,在之前的学习中我们可以知道在JAVA中1.0-0.8不等于0.2,会产生精度误差,那么我们现在用 java.math.BigDecimal
来再次进行尝试,代码链接,得到如下结果
BigDecimal提供plus()
、substract()
、multiply()
、divide()
等方法,来进行加减乘除等运算。还有equals()
可以比较两个BigDecimal实质上是否相等,避免了判断能不能用==来判断相等的错误。代码链接,得到下图所示结果
此处需要注意a.add(b).add(c).equal(result)
的写法。
对象指定与相等性
此处需注意,当你在操作对象的时候,=是用在指定参考名称参考某个对象,而==是用在比较两个参考名称是否参考同一对象。
基本类型打包器
打包基本类型,有助于了解基本类型与对象的差别,要想对基本类型像对象一样操作,可以使用long
,Integer
、Double
、Float
、Boolean
、Byte
等类来打包基本类型,这些类就是所谓的打包器。
数组对象
在JAVA中数组就是对象。
数组基础
- 首先建立数组,方法是:
1.元素类型[] 数组名={元素1,元素2,...元素n};(适用于知道数组各元素)
2.元素类型[] 数组名=new 元素类型[长度];(适用于不知道数组的元素但知道长度的数组)
3.元素类型[] 数组名=new 元素类型[]{元素,...};(适用于赋一定初值)
对于二维:
1.元素类型[][] 数组名={{第一行个元素},{第二行个元素}...};
2.元素类型[][] 数组名=new 元素类型[行长度][列长度];
三维以上同理。 - 其次要想取出数组中的所有元素,可以用length属性取得数组的长度,再用for循环依次取出数组中的值,也可用更方便的增强式for循环。前者代码链接,运行结果如下:
后者语法为for(int score :scores){ System.out.printf("学生分数: %d %n",score); }
- 在二维变量中用
数组名.length
来得知有几行,用数组名[x].length
来得知有几列,也可以使用增强式for循环来改写。这样会更简洁,代码链接,运行结果如下图
数组对象的操作以及复制
-数组对象的操作
1.不同数据类型的数组有着各自的初值,要想改变初始值就可以使用java.util.Arrays
的fill()
来设定初始值,例如代码链接,运行如果如下
2.二维数组也可以是不规则的,代码链接,运行结果如下图
3.注意Integer类型的数组初始值为null。
- 数组复制
数组复制分千层赋值以及深层复制
浅层复制有以下几种方法:
1.在已有数组1下再建立一个新的数组2,长度为数,1的长度,再利用循环一个一个赋值。
2.新建一个同上的数组,用System.arraycopy()
,它的的五个参数分别是来源数组、来源起始索引、目的数组、目的起始索引、复制长度。
3.用arrays.copyOf()
不用另行建立新数组。例如,代码链接,运行结果如下图
深层复制需要将一些属性也一起复制,代码链接,运行结果如下:
字符串
在Java中,字符串是java.lang.String
实例,用来打包字符数组,因此在JAVA中字符串是对象,但是可以将字符串剖析为基本类型,进行如下练习,代码链接,运行结果如下图
注意:在JAVA中只要“”包括的字符串一样,那么判断两个字符串是否==时,答案是true,但需注意如果是new string("")
时,便是新建一个string实例,所以又是不同的对象了。要判断实际字符内容是否相等依旧应该使用equals()
。
第五章 对象封装
封装
- 封装就是将类的内容隐藏起来,让用户不用且不能对类的内容进行修改,将对象的细节隐藏了起来。
- 可以用构造函数的方法来实现对象初始化流程的封装。
- 定义方法来操作对象。在类中定义方法,如果不用返回值,方法名称前可以声明void,方法若有返回值,必须在方法前声明返回值的类型。
- 有些数据是类所私有的,那么可以使用private关键字定义。
类语法细节以及关于构造函数
- public权限修饰,对于想要可以公开使用的类、函数以及方法等需要声明为public权限。
- 没有定义任何权限关键字时,就是包权限。
- 构造函数是与类名称同名,无须声明返回类型的方法。
- 可以定义多个构造函数,只要参数类型或个数不同,这称为重载。
使用this
- 在构造函数参数与对象数据成员同名时,可以用this加以区别。
- this()代表了调用另一个构造函数,至于调运哪个构造函数,则看调用this()时给的自变量类型与个数而定。练习(代码),运行结果如下
static类成员
被声明为static的成员,不会让个别对象拥有,而是属于类,将类名称作为名称空间。通过类名称与"."运算符来存取的。在static方法或区块中不能出现this关键字,也不能调用非static方法或区块。
不定长度自变量以及内部类
使用不定长度自变量时,方法上声明的不定长度参数必须是参数列最后一个。不允许使用两个以上不定长度自变量。
教材学习中的问题和解决过程
- 1对练习题2中的结果不知道该怎么解释。即均为true的原因。
- 查阅书籍、上网搜索都没有得到解决。
- 2.书本p99页上的
int [] score1={88,81,74...}; int[] score2=score1; score2[0]=99
,输出score1[0],是99,而不是88,这是为什么呢? - 解决:通过再次查看书本的相关内容,数组时对象将score2=score1,就是经score1参考的对象给了score2,也就是两者参考的是一个对象,无论改变谁,对象发生了改变,那么结果也必然改变。
代码调试中的问题和解决过程
-
1.不明白增强for循环中的控制变量的语法,例如在Score2中的
for(int score : scores)
score是怎么来的呢,是固定的吗? -
解决:通过查阅书籍以及上网查询,发现前面的score只是一个变量,可以将其改为别的例如Score3,代码链接,得到结果如下,与Score2的结果相同。
-
2.在打印二维数组时在四一层循环里面会有一行
System.out.println()
,这个是用来二维数组行与行之间换行用的,那么如果换成printf也可以吗? -
编了一个程序,将println换成了
printf("/n")
以及print("/n")
这样之后发现结果都是一样的。 -
3.在深层复制(代码)的时候为什么要将c1中的每个索引参考的对象先给c再给c2?当我把c1中的索引参考的对象直接给c2的时候会出如下错误,是为什么呢?
-
解决:已解决,不知道哪里出现了错误,再次编译之后的确可以直接复制。
代码托管
-
代码提交过程截图:
-
代码量截图:
上周考试错题总结
1.查找前天的文件,应该用2,查java文件应该用name.*java。
2.对于取反以及计算机中负数以补码存放了解的不够深刻。
3.java中,非零数字并不等价于true。
其他(感悟、思考等,可选)
相比较前两周这周的学习任务更为繁重一些,因此学习到的内容明显增加,学习时间也有所提高,自己练习的代码行数也明显增加。
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 | |
第一周 | 20/20 | 1/4 | 20/20 | |
第二周 | 145/165 | 1/5 | 12/32 | |
第三周 | 411/576 | 1/6 | 16/48 |
尝试一下记录「计划学习时间」和「实际学习时间」,到期末看看能不能改进自己的计划能力。这个工作学习中很重要,也很有用。
耗时估计的公式
:Y=X+X/N ,Y=X-X/N,训练次数多了,X、Y就接近了。
-
计划学习时间:18小时
-
实际学习时间:16小时
-
改进情况:学习时间有所提高。