20155318 2016-2017-2 《Java程序设计》第三周学习总结
教材学习内容总结
一、类与对象
-
Clothes c1 = new Clothes();
将c1名称参考至新建对象(其中Clothes是一个类,c1就是一个对象) - 一个原始码可以有多个类定义,但只有一个是公开类,且文档名称与公开类名称相同
- 定义构造函数(与类同名的方法)
- 尽量不要在一个类中写多个class,如果有多个class,也只能有一个类前面加
public
-
System.in
对象上的int方法,是以int类型返回读入的字符编码。 - 标准类
-
java.util.Scanner
不需要每次输入java.util.Scanner,只需要输入Scanner,Scanner中的nextInt()方法会看标准输入中有没有输入下一个字符串,有的话会将之剖析为int类型。 -
java.math.BigDecimal
计算浮点数可以得到更好地精确度,内部提供plus(),substract(),multiply(),divide()方法,例如在整型条件下的a+b+c==0.3
在这里写为a.add(b).add(c).equals(0.3)
-
- '='将某个名牌绑到某个对象,'=='将两个名牌绑到同一个对象上
- 打包器:为对象提供壳的类,类如Integer中的方法doublValue()可以返回double类型,compareTo()可以让Integer中的两个对象相比较,相同返回0;小于传入对象返回-1,大于返回1;
- 自动装箱、拆箱(基本类型):使用Long、Integer、Double、Float、Boolean、Byte等类来打包基本类型,将基本类型当作对象操作。J2SE5.0后可以自动装箱、拆箱。
Integer wrapper =10;//自动装箱
int foo = wrapper;//自动拆箱
封装 = 类 + 访问控制
- 总结:要产生对象必须先定义类,类是对象的模板,对象是类的实例。定义类使用class关键字,实例化对象使用new关键字。
二、数组
- 声明并赋初始值
int[] scores={……};
- 数组名.length表示数组的长度
- Java中数组是对象
- 与C语言不同,Java检查数组边界,越界会触发
ArrayIndexOutOfBoundsException
异常 - 操作数组对象:使用new建立数组后,每个索引元素会有默认值,如果默认值不符合需求,则使用
java.util.Arrays
的fill()
方法设定新建数组的元素值,代码:
Arrays.fill(scores,60);
for(int score : scores){
System.out.printf("%3d",score);
}
运行结果:
- 注意用new指定初始值,不必写数组长度
- 数组复制
- 浅层复制
System.arraycopy()
和Arrays.copyof()
-
scores2 =Arrays.copyOf(scores1,scores1.length)
或System.arraycopy()
中的五个参数分别是来源数组、来源起始索引、目的数组、目的起始索引、复制长度。
- 深层复制
- 浅层复制
Clothes2[] c2 = new Clothes2[c1.length];
for(int i = 0; i < c1.length; i++)
{
Clothes2 c = new Clothes2(c1[i].color, c1[i].size);
c2[i] = c;
}
三、字符串
- 字符串的本质是打包字符数组的对象,是java.lang.String类的实例
-
length()
取得字符串长度 -
charAt()
取得字符串中某个字符 -
toUpperCase()
将原本小写的字符串内容转为大写的字符串内容 - 用 "" 写下的字符串称为字符串常量,使用 + 连接字符串会产生新的String实例
四、封装
- 封装目的主要是隐藏对象细节。
- 使用private定义私有成员,封装了类私有数据,让用户必须通过你提供的操作方法,经过你定义的流程才有可能存取私有数据。
- 通过构造方法(构造函数)封装初始化流程
- 通过成员方法(函数)封装操作
- 通过成员变量封装数据
五、重载
- 可以定义多个构造函数,只要参数类型或个数不同。
- 定义方法时也可以进行重载,虽然调用的方法名称相同,但根据传递的自变量类型不同,会调用对应的方法
六、this
- this代表其所在函数所属对象的引用,简而言之就是this代本类对象的引用,当在函数内需要用到调用该函数的对象时,我们就可以使用this。
- this()代表了调用另一个构造函数,至于调用哪个构造函数,则视调用this()时给的自变量类型与个数而定。
七、static关键字
- static用于修饰成员(成员变量和成员函数),被声明为static的成员,不会让个别对象拥有,而是属于类。
- 在static方法中不能出现this关键字,static方法中不能用非static数据或方法成员。
- import static语法是为了偷懒,但要注意名称冲突的问题。
教材学习中的问题和解决过程
- 问题1:浮点数误差
- 问题1解决方案:利用BigDecimal
public static void main(String[] args) {
BigDecimal a=new BigDecimal("0.1");
BigDecimal b=new BigDecimal("0.1");
BigDecimal c=a;
System.out.println(a==b);
System.out.println(a==c);
System.out.println(a.equals(b));
}
运行这段代码会得出如下结果
因为a和b都是浮点数,直接用“”会产生误差,利用BigDecimal中的equals()可以解决这个问题,另外需要注意的是'='和 “”的区别。
问题2 package与project与class
解决方案:百度。上周的git截图没有分目录 =,这周将代码重新按照老师给的目录整理了一下,首先要区分的的就是package与project与class的区别
project 是Java的项目,是所做的整个东西的集合,当然也有的大型工程可以是由若干个小项目组合而成的。
package 即包管理;是Java用来识别项目中各个类之间的层次关系,一个project项目中可以采用package的方式对你的class(类)进行分层管理,就好象我们在Windows操作系统中常见的文件目录管理一样。
project采用package方式管理class
问题3:课本92页代码
public static void main(String[] args) {
Integer i=10;
System.out.println(i+10);
System.out.println(i++);
}
运行结果如下:
为什么i++不显示11而是10
- 解决方案
- 运行
Integer i=0;
System.out.println(++i);
System.out.println(i++);
分别显示1和0
- i=i++是先赋值在自增,所以无论循环多少次,左边的i始终是0,最后结果就是0。这里和C语言有所不同
- i=++i,++i是先自增在赋值。
- 问题4:增强式for循环的score和scores
- 解决方法:增强式for循环
for (int score : scores){
System.out.printf("score: %d %n",score);
}
for(数据类型 代表数组中每个元素的名字:数组名)这个score可以是任何名字,这代表代表每次循环时候数组中的每个元素,可以用其他字母代替。
- 问题5:数组的相关问题
- 顺序走访二维数组
public class XY {
public static void main(String[] args) {
int[][] cords={
{1,2,3},
{4,5,6}
};
for(int[] row : cords)
{
for(int value : row)
{
System.out.printf("%2d",value);
}
System.out.println();
}
}
其中
int[][] cords
- 将数组1指给数组2,数组1中的对象也会指给数组2
int scores2=scores1;
scores2[0]=99;
System.out.println(scores1[0]);
- 无论score1怎么初始化,运行结为99
- 因为数组是对象,scores1和scores2是参考名称,将scores1指给scores2,是将scores1参考的对象也指给scores2参考,(scores1和scores2共同指向同一个对象)
- 二维数组也可以是不规则的数组,直接定义即可。
int[][] arr=new int[2][];
arr[0]=new int[] {1,2,3,4,5};
arr[1]=new int[] {1,2,3};
for(int[] row:arr)
{
for(int value:row)
{
System.out.printf("%2d",value);
}
System.out.println();
- 问题6:String/StringBuffer/StringBuilder的区别
- String:字符串常量,字符串长度不可变。
- StringBuffer:字符串变量,可以频繁对字符串内容进行修改,使用 StringBuffer 类时,每次都会对 StringBuffer 对象本身进行操作,而不是生成新的对象并改变对象引用。
- StringBuilder:字符串变量(非线程安全)。在内部,StringBuilder对象被当作是一个包含字符序列的变长数组。StringBuilder > StringBuffer
- 如果要操作少量的数据,用String ;单线程操作大量数据,用StringBuilder ;多线程操作大量数据,用StringBuffer
- 问题7:Java中怎么实现数字与数字字符串的互换
- 解决方案:(不理解)
- 123->“123”:
int atoi(String nptr)
- “123”->123
String itoa(int value, int radix)
代码调试中的问题和解决过程
问题1:课本85页利用构建函数指定对象的成员,编译时出现了如图所示的错误提示:
解决方案:删去如图所示代码后毕通过正常运行原因未知
问题2:运行87页代码时产生如下错误提示
解决方案:改变原来代码目录之后,没有改package……这句代码,导致运行错误,应该改为
package chapter04.src
问题3:数组复制
int[] scores1={88,66,48,99,12,45,55,76};
int[] scores2=scores1;
用上面这个代码不能复制数组,复制应该是出现两个内容相同的对象,但这只是让两个变量指向了同一个对象,也就是对象只有一个,并没有两个。所以真正的复制应该是这样的:
int[] scores1={88,66,48,99,12,45,55,76};
int[] scores2=new int[scores1.length];
for(int i=0;i<scores1.length;i++){
scores2[i]=scores1[i];
}
问题4:用Idea上传代码的时候总是出现这样一个警告
解决方案:这是在警告我们需要填写Commit Message,填写后可以上传。
代码托管
代码提交过程截图:
运行(起初Idea没有调试,依然使用了git bash here上传代码,Idea可以给每个代码填注释,今后会使用)
git add .
git commit -m "week03"
git push origin master
并截图
代码量截图:
运行statistics脚本
#!/bin/sh
#by rocedu(http://www.cnblogs.com/rocedu/)
echo "//==========Today====================================="
echo "code summary infomation:"
find . -name "*.java" -mtime 0 | xargs cat | grep -v ^$ | wc -l
echo "documents summary infomation:"
find . -name "*.md" -mtime 0 | xargs cat | grep -v ^$ | wc -l
echo "commit history:"
git log --pretty=format:"%h - %an,%ci: %s " | grep `date +%F`
echo ""
echo ""
echo "//==========This Week================================="
echo "code summary infomation:"
find . -name "*.java" -mtime -7| xargs cat | grep -v ^$ | wc -l
echo "documents summary infomation:"
find . -name "*.md" -mtime -7| xargs cat | grep -v ^$ | wc -l
git log --pretty=format:"%h - %an,%ci: %s " | grep `date +%F --date="-1 days"`
git log --pretty=format:"%h - %an,%ci: %s " | grep `date +%F --date="-2 days"`
git log --pretty=format:"%h - %an,%ci: %s " | grep `date +%F --date="-3 days"`
git log --pretty=format:"%h - %an,%ci: %s " | grep `date +%F --date="-4 days"`
git log --pretty=format:"%h - %an,%ci: %s " | grep `date +%F --date="-5 days"`
git log --pretty=format:"%h - %an,%ci: %s " | grep `date +%F --date="-6 days"`
git log --pretty=format:"%h - %an,%ci: %s " | grep `date +%F --date="-7 days"`
echo ""
echo ""
echo "//==========All================================="
echo "code summary infomation:"
find . -name "*.java"| xargs cat | grep -v ^$ | wc -l
echo "documents summary infomation:"
find . -name "*.md"| xargs cat | grep -v ^$ | wc -l
echo "commit history:"
git log --pretty=format:"%h - %an,%ci: %s "
- 代码量截图
上周考试错题总结
- Linux Bash中,查找当前目录中前天创建的Java文件的命令是(find . –name *.java -ctime 2)。注意前天参数为2
- 判断: Java中,数字235.00的类型是float. (X)float类型范围为-127~128
- 填空:~0b1011的十进制值是(-12)
- 判断:Java中,非零数字等价于true.(X)
- 0x10%9 的结果是(7)0x10&9 的结果是(0)
其他(感悟、思考等,可选)
上周错题有些多,这周新知识量也比较大,觉得学习起来问题挺多,之后会继续努力。学Java还是要多编代码,建议老师减轻一下每周的学习任务,让我们有更多的时间去编代码练习。
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 | |
第一周 | 50/100 | 1/1 | 24/24 | 安装学习Java的一系列软件 |
第二周 | 250/300 | 1/2 | 30/54 | 了解Java的基本语法 |
第三周 | 552/852 | 1/3 | 16/60 | 了解Java是面向对象的语言 |
计划学习时间:20小时
实际学习时间:14小时