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.ScannerScannernextInt()方法会看看标准输入中有没有下一个字符串,有的话会尝试将之剖析为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,IntegerDoubleFloatBooleanByte等类来打包基本类型,这些类就是所谓的打包器。

数组对象

在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.Arraysfill()来设定初始值,例如代码链接,运行如果如下

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就接近了。

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

参考资料

posted @ 2017-03-11 21:03  20155339平措卓玛  阅读(301)  评论(7编辑  收藏  举报