首页 > 技术文章 > 20155227 2016-2017-2 《Java程序设计》第三周学习总结

guyanlin 2017-03-12 14:05 原文

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

教材学习内容总结

类与对象

使用Java撰写程序几乎都在使用对象,要产生对象必须先定义类,类是对象的设计图,对象是类的实例。定义类时用关键词class,利用类建立对象实例用new关键词。

  1. Java中变量有2种类型,一个是基本类型,另一个则是类类型。两个基本的标准类:java.util.Scanner与java.math.BigDecimal。
  2. BigDecimal提供有plus()、substract()、multiply()、divide()可以进行加、减、乘、除等运算。

基本类型打包器

Long、Integer、Double、Float、Boolean等类就是打包器。这些类的主要目的是提供对象实例作为“壳”,将基本类型打包在对象之中,这样就可以操作这个对象,就像是将基本类型当作对象操作。J2SE5.0后可以自动装箱、拆箱。编写Java时一定要把固有的“面向过程”的思想转化为“面向对象”.

数组对象

数组在Java中就是对象。

  1. 格式:
元素类型[] 数组名=new 元素类型[元素个数或数组长度];
元素类型[] 数组名=new 元素类型[]{元素,元素,...};
元素类型[] 数组名={元素,元素,...};

2.二维数组:二维数组使用两个索引存取数组元素。要声明二维数组,就是在类型关键词庞建加上[][]。

3.数组复制
浅层复制:仅将每个索引处所参考的对象给复制的参考,并没有复制出对象。System.arraycopy()和Arrays.copyof()都是执行的浅层复制。

深层复制:连同对象一同复制,必须自行操作。

字符串对象

字符串本质是打包字符数组的对象,是java.lang.String类的实例。

length()是取得字符串长度,charAt()是取得字符串中某个字符,toUpperCase()是将原本小写的字符串内容转为大写的字符串内容。

用 "" 写下的字符串称为字符串常量,使用 + 连接字符串会产生新的String实例。

封装

封装是不用重复撰写对象初始化流程。封装的目的书要是隐藏对象细节,将对象作为黑箱操作。构造函数就是在实现对象初始化流程的封装。

类语法

  • public

public为公开类,在构造函数上声明public表示其他包中的类可以直接调用这个构造函数,在方法上声明public表示其他包的方法可以直接调用这个方法。

  • private

可以用private定义私有数据类型。用在成员变量前,这是一种保护机制。

  • 构造函数

只有编译程序自动加入的构造函数,才成为默认构造函数。如果自行撰写无参数、没有内容的构造函数就不是默认构造函数了。

  • 重载

在同一个类中,允许存在一个以上的同名函数,只要他们的参数个数或者参数类型不同即可。

  • this

除了被声明为static的地方外,this关键字可以出现在类中任意地方,在对象建立后为“这个对象”的参考名称。this()代表了调用另一个构造函数,至于调用哪一个构造函数,则视调用this()时给出的自变量类型与个数而定。

  • static类成员

被声明为static的成员,不会让个别对象拥有,而属于类。在static方法或区块中,不能出现this关键字。static方法中不能使用非static数据或方法成员。

  • 不定长度自变量

使用不定长度自变量时,方法上声明的不定长度参数必须是参数列最后一个。

  • 内部类

在类中再定义类。

教材学习中的问题和解决过程

  • 1问题

不是很理解浅层复制和深层复制到底有什么区别

  • 1解决方案

反复看书,敲了书上关于浅层复制和深层复制的几段代码,对两者的区别大致有了一点理解。在java中,默认是浅层复制的,如果要复制的对象中只含有基本数据类型和String类型,那么浅层复制和浅层复制是没有区别的,所以可以放心的使用默认的浅层复制,但是如果要复制的对象中除了上述类型还有数组和集合的话,浅层复制和深层复制是有区别的,有时候会出现意想不到的效果。

  • 2问题

如果不同包的类程序代码中想直接存取要怎么做?

  • 2解决方案

如果想在其他包的类程序代码中存取某包的类或对象成员,则该类或对象成员必须是公开成员,在Java中要使用public加以声明。

  • 3问题

尽管看完了书也照着书上敲了代码,但是看了课后操作题还是一头雾水无从下手。脑子里细碎的知识点太多,但是遇到实际的问题时还是不知道怎么动手解决。

  • 3解决方案

待解决。要解决实际操作的问题并不简单,可能是我学习得太浅了。多说不如多学,希望能逐渐掌握要领。

代码调试中的问题和解决过程

  • 1问题
    在学习书上P109页的程序Sum时,出现了以下问题。

  • 1解决方案

    将println改为了printf。这主要是因为println是用于输出参数内容,然后换行,其参数个数固定为一个,而printf是用于输出带各种数据类型的占位符的参数,其参数个数是不定的,所以上面的代码应该用printf。

代码托管

  • 代码提交过程截图:

  • 代码量截图:

上周考试错题总结

  • 运行class文件:

执行带main方法的class文件,命令行为:
java < CLASS文件名 >
注意CLASS文件名不要带文件后缀.class。

如果执行的class文件是带包的,即在类文件中使用了:package <包名>
那应该在包的基路径下执行,命令行为:
java <包名>.CLASS文件名

  • ~0b1101的十进制数值:

看到这道题的时候觉得很简单,结果是自己想错了。正确结果是-12.。00001011取反后为11110100,得到的有符号数是一个负数,将这个负数的补码取反加一得到原码。10001011+1得到10001100.

  • 在linux bash中查找两天前创建的Java文件的命令:find -ctime 2 -name *.java

其他(感悟、思考等,可选)

本周学习的知识相比前两周来说不管是量还是内容都着实上了一个台阶,仅仅是对象这一个内容就让我晕头转向。这两章需要掌握的概念都比较抽象又不容易理解,看完之后感觉又忘了,这就需要我不停地练习来加以巩固。

学习进度条

代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
目标 5000行 30篇 400小时
第一周 10/10 1/1 20/20
第二周 98/108 1/2 20/40
第三周 401/509 1/3 15/55

尝试一下记录「计划学习时间」和「实际学习时间」,到期末看看能不能改进自己的计划能力。这个工作学习中很重要,也很有用。
耗时估计的公式
:Y=X+X/N ,Y=X-X/N,训练次数多了,X、Y就接近了。

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

  • 计划学习时间:20小时

  • 实际学习时间:15小时

参考资料

推荐阅读