20155320 2016-2017-3 《Java程序设计》第三周学习总结
教材学习内容总结
定义类
步骤:
- 在程序中定义类
- 使用
new
关键词新建一个对象 - 声明参考名称,并将名称参考至新建对象
- 定义对象数据成员
运行结果为:
同时还可以通过定义构造函数的方法来达到同样的目的,在这种情况下使用new创建对象时,就可以直接传入字符串与字符,最后结果并无差异。
运行结果如下,与上一个运行结果一致:
使用标准类
使用java.util.Scanner
- 使用import偷懒,这样每次都只要输入Scanner就行
- 在建立Scanner实例时,必须传入java.io.InputStream的实例,此处即为
System.in
- Scanner的nextInt方法会将输入的下一个字符串剖析为int类型,nextByte()、nextShort()、nextLong()等同理。若想直接取得上一个字符串,则使用next(),nextLine()能取得用户输入的整行文字。scanner 的nextInt()代码
运行结果为:
使用java.math.BigDecimal
- 在使用浮点数时为了避免误差,得到更好的精确度可以使用java.math.BigDecimal
- BigDecimal 提供有plus(),substract(),multiply(),divid()等方法,可以进行加、减、乘、除==。BigDecimal的加减乘除代码
运行结果为
- =是用指定参考名称参考某个对象,==是比较两个参考名称是否参考同一对象,equals()是比较两对象的内涵值。==,=,equals()的区别代码
运行结果为:
数组对象
- 数组是用来收集数据,具有索引的数据结构
- 若要依次取出数组中的每个值可以有两种方法1.使用for循环2.使用增强式for循环。两者效果相同,但增强式for循环更简洁。
- 数组的length属性可以取得数组长度
运行结果一致,均为:
- 可以使用new关键词来指定数组长度建立数组,例如:
int[] scores=new scores[10]
,当想一并指定初始值时不要定义数组长度,
可以使用java.util.Arrays的fill方法来设定新建的初始值。
使用Arrays.fill的程序
运行结果为:
二维数组同一维数组类似
二维数组下的两种取值方法使用类类型建立数组时需注意,
Integer[] scores=new Integer[3]
建立的是0个参考对象,因为如果建立的是类类型,那么每个索引都是参考至null的。数组的复制,可以使用
Arrays.copyOf()
方法,括号内第一个为需复制的数组,第二个位新建数组的长度。无论
Systemh.arraycopy()
还是Arrays.copyof()
,用在类类型声明的数组时都是 浅层复制程序。
运行结果为:
- 深层复制需要自行复制元素。深层复制程序
运行结果为:
由深层复制与浅层复制的程序运行结果与程序对比可以看出虽然都新建了参考但是浅层复制并没有实际复制元素。
字符串对象
- 字符串本质是打包字符数组的对象,是java.lang.String类是实例,用来打包字符数组。
- 字符串拥有对象的操作性质,
length()
取得字符串长度,charAt()
指定取得字符串中某个字符(索引从0开始),toUpperCase()
将原本小写的字符串内容转换为大写。 - 可以使用
toCharArray()
方法将字符串以char[]数组的形式输出。 - 将字符串转化为整数、浮点数等类型,可以使用类似
Byte.parseByte(number)
- 可以用+连接字符串。
字符串的转换为基本类型的代码 - 为了效率,以“”包括的字符串,只要内容相同,无论在程序中出现几次,都只会建立一个String实例,并在字符串池中维护,而new一定是建立新对象。
字符串池的程序
public class Justin {
public static void main(String[] args) {
String name1="justin";
String name2="justin";
String name3=new String("justin");
String name4=new String("justin");
System.out.println(name1.equals(name2));
System.out.println(name3.equals(name4));
System.out.println(name1==name2);
System.out.println(name4==name3);
}
}
运行结果为(可明显看出字符串池的特点):
- 要比较字符串实际内容是否相同,不要使用==,要使用
equals()
- 在java中,字符串对象一旦建立就无法改变对象中的任何内容
- 使用+连接会产生新的String实例,因此不要将+用在重复性的连接场合,例如循环和递归时
对象封装
-
在编写具有多步重复步骤的程序时,可以1.定义方法2.使用数组来让程序更简洁。
使用
private
关键字定义那些类所私有的数据,这样就阻止了用户*存取类私有数据,只有当提供有方法存取private成员时,用户才能存取。-
取值方法的名称形式是固定的,以get开头,之后接上首字母大写的单词。
声明为private的成员,用户无法再其他类的程序代码中直接存取,没有声明权限修饰的成员,只有在相同包的类程序代码中才可以直接存取。若要直接存取,必须要使用public声明
方法重载可根据传递自变量的类型不同,也可根据参数列个数的不同来设计方法重载,返回值类型不可以作为方法重载依据。
this()代表调用另外一个构造函数,但是this()调用只能出现在构造函数的第一行
若对象数据成员被声明为final,但没有明确使用=指定值,那表示延迟对象成员值的指定且必须要指定,否则编译错误。
被声明为static的成员不会让个别对象拥有,而是属于类,方法也能被声明为static成员,可以通过类名称与“.“运算符来调用,极度不建议使用参考名称存取static成员
static方法或区块中不能出现this关键词,也不能调用非static方法或区块
教材学习中的问题和解决过程
- 在学习第四章时,StringBuilder.append操作并不是很懂,我按照课本上的程序编写了one To 100
- 后来我按照课本方法到官网查阅了相关的API,但看不太懂,最后我在一篇名为java中stringBuilder的用法的博客中了解到
Append 方法可用来将文本或对象的字符串表示形式添加到由当前 StringBuilder对象表示的字符串的结尾处。
Append()每次调用过后,都会返回StringBuilder对象。
- 在学习第四章的操作数组对象时,在编写IntegerArray时(代码如下),为何装箱是
scores[0]=new Integer(90)
,而不是Integer scores[0]=new Integer(90)
,且如果写成这样的话编译还会出现错误
public class IntegerArray {
public static void main(String[] args) {
Integer[] scores=new Integer[3];
for(Integer score:scores){
System.out.println(score);
}
scores[0]=new Integer(90);
scores[1]=91;
scores[2]=88;
for(Integer score:scores){
System.out.println(score);
}
}
}
-这个我目前还没有找到原因。
代码调试中的问题和解决过程
- 在按照书上以类类型建立数组时,输出每个数组中的每个值时,出现了如下错误:
我的代码是:
public class IntegerArray {
public static void main(String[] args) {
Integer[] scores=new Integer[3];
for(score:scores){
System.out.println(score);
}
scores[0]=90;
scores[1]=91;
scores[2]=88;
for(score:scores){
System.out.printf("%2d",score);
}
}
}
- 通过对照我发现,这是由于我在使用增强for循环时,没有给score定义为同参考名同类的类类型。修改后编译成功,正确代码ps:此处极易出错,在后边的编程中我多次出现了同一错误。
-在练习BigDecimal的加法时,课本上说plus()和add()均为其加法,然而我在编程写plus()时却出现了编译错误。
程序如下:
错误截图:
- 查阅资料后发现BigDecimal的加法就是add()。
代码托管
代码提交过程截图:
-
代码量截图:
上周考试错题总结
- 题6,0b1011的十进制数是(-12),没有正确理解补码,以及在java中均为有符号数,且以1byte即8位来储存,所以,0b1011=11110100,补码的原码为10001100,十进制即为-12。
- 题12,看错了,正确应该为0.123=1.23e-3
-题1, Linux Bash中,查找当前目录中前天创建的Java文件的命令是(find . –name *.java -ctime 2)
其他(感悟、思考等,可选)
本周的学习任务有两章且难度相较前几周都有提升,但是我吸取了前几次的经验,分散了学习时间,且在本周的学习中我发现了编程的必要性,有许多看了以后觉得理解了的,实际操作起来就会忘,并且通过自己编程我发现了许多和书上描述的不同的地方,比如BigDecimal的加法,编写程序IntegerDemo时,使用doubleValue()将打包值以double类型返回后,结果并不是书上写的3.3333333333...,而是
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 | |
第一周 | 20/20 | 1/4 | 20/20 | 安装了JDK及IDEA |
第二周 | 144/164 | 1/5 | 18/38 | 学习了java语言的基本语法 |
第三周 | 447/567 | 1/6 | 20/ 58 | 掌握了一些有关对象和封装的内容 |
尝试一下记录「计划学习时间」和「实际学习时间」,到期末看看能不能改进自己的计划能力。这个工作学习中很重要,也很有用。
耗时估计的公式
:Y=X+X/N ,Y=X-X/N,训练次数多了,X、Y就接近了。
计划学习时间:22小时
实际学习时间:20小时
改进情况: