您的位置:首页 > 编程语言 > Java开发

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

2017-03-11 21:03 411 查看

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/201/420/20
第二周145/1651/512/32
第三周411/5761/616/48
尝试一下记录「计划学习时间」和「实际学习时间」,到期末看看能不能改进自己的计划能力。这个工作学习中很重要,也很有用。

耗时估计的公式

:Y=X+X/N ,Y=X-X/N,训练次数多了,X、Y就接近了。

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

计划学习时间:18小时

实际学习时间:16小时

改进情况:学习时间有所提高。

有空多看看现代软件工程 课件 软件工程师能力自我评价表

参考资料

Java学习笔记(第8版)

《Java学习笔记(第8版)》学习指导
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: