2016-2017-2 学习总结目录: 1 2 3 4 5 6 7 8 9 10
20162330_刘伟康_ 第5周学习总结
教材学习内容总结
课本内容:(编写类)
1.对象和类的关系;(类是对象的蓝图)
2.理解对象的状态(属性)和行为(操作);
3.理解类的分配职责和一些类的构造方法;
4.了解UML类图(统一建模语言);
5.公有和私有可见性修饰符(public、private);
6.理解方法定义和方法声明;(还未理解)
7.return语句的使用;
8.静态方法的调用;
9.类之间的关系(依赖、聚合、继承);(还未掌握)
10.方法设计(方法分解、方法参数的传递);(还未掌握)
11.方法重载(参数类型、个数不同);
12.测试和调试(jdb、print语句)。
蓝墨云班课:
1.面向对象的概念(编程方法、思维方式、非编程语言);
2.面向对象的思维方法(习惯于将面向对象与现实世界作比较);
3.面向对象的终极目标;(DRY)
4.类的定义方法和表示方法;
5.了解生成对象的过程(栈、堆内存);
6.了解多个对象、匿名对象的创建方法(new);(还未掌握)
7.理解函数的重载;
8.简单了解构造函数的作用和语法;
9.使用this调用函数的方法;(还未掌握)
10.使用static定义静态成员变量。
教材学习中的问题和解决过程
问题1:
在蓝墨云班课中听面向对象基础(二)的时候,不理解下面(如图)这句话,仅仅凭借蓝墨云课堂上的例子也不能够理解成员变量和局部变量的区别,后来在课本上看到类变量的定义后,对于成员变量、局部变量和类变量更加分不清。问题1解决方案:
通过搜索引擎,我基本理解了三者的区别:- 首先,三者的概念可以这样浅显地理解:
成员变量:属性的另一种叫法,也可以称作“全局变量”,主要用于描述类的状态。
例如:生活中的汽车,可以看做一个类,我们称之为汽车类,每一台车都有颜色和轮胎数,这就可以定义为属性,即成员变量。(可参考以下程序) 编写Car类:
public class Car {
private String color; // 定义汽车颜色,全局变量
private int numLuntai; // 定义汽车轮胎数,全局变量
public Car(String color, int numLuntai){
super();
this.color = color;
this.numLuntai = numLuntai;
}
public void run() {
System.out.println(this.numLuntai+ "个轮子的" +this.color + "轿车在马路上行驶着");
}
}
- 运行Car类的程序:
public class ClassTest {
public static void main(String[] args){
Car bmw = new Car("黑色", 4); // 创建一个轿车对象,名字为bmw
bmw.run();
}
}
- 运行结果:
4个轮子的黑色轿车在马路上行驶着
- 局部变量:在程序中只在特定过程或函数中可以访问的变量。也可以理解为除了成员变量之外的变量。例如上面的程序中color和numLuntai就称为Car类的成员变量,这个属性能够用来描述一个类的属性,否则,它就应该定义为局部变量。
例如一个for循环中的i即是局部变量:
for(int i = 0; i < args.length; i++) {
......
}
- 又例如写在成员方法中变量是局部变量:(在上面编写类的程序中加入一个String类定义,主函数运行程序不变)
public class Car {
private String color; // 定义汽车颜色,全局变量
private int numLuntai; // 定义汽车轮胎数,全局变量
public Car(String color, int numLuntai){
super();
this.color = color;
this.numLuntai = numLuntai;
}
public void run() {
String carName=”宝马牌”; //这个就是局部变量
System.out.println(this.numLuntai+ "个轮子的" +this.color + carName+"轿车在马路上行驶着");
}
}
- 运行结果:
4个轮子的黑色宝马牌轿车在马路上行驶着
- 类变量:也叫静态变量,由static修饰,其实质上就是一个全局变量。如果某个内容是被所有对象所共享,那么该内容就应该用静态修饰;没有被静态修饰的内容,其实是属于对象的特殊描述。
(注意:属于静态存储方式的量不一定就是静态变量。 例如:外部变量虽属于静态存储方式,但不一定是静态变量,必须由static加以定义后才能成为静态外部变量,或称静态全局变量。)
举例如下: - 编写Person类:
class Person{
//成员变量,实例变量
String name;
//静态变量,类变量
//所有对象共享的属性用static修饰
static String country = "CN";
public void show(){
System. out.println(country + ":" + name);
//等效语句:System.out.println(Person.country+ ":" + this.name);
}
}
- 其运行程序如下:
class StaticDemo{
public static void main(String[]args){
Personp = new Person();
System. out.println(p.country);
//可以用类名直接调用
System. out.println(Person.country);
}
}
- 运行结果:
CN
CN
- 还查到一种比较简洁的说法:局部变量离开了他的域{}就无效,成员变量的范围依赖他的访问修饰符(public,protected,private,friendly,default)(课本上提到三种),定义时不给他访问修饰符就是默认为friendly或者default访问。我还找到了一道题目,解析挺详细:
- 综上所述,三者的区别可参考此表格:
成员变量 | 局部变量 | 静态变量 | |
---|---|---|---|
定义位置 | 在类中,方法外 | 方法中,或者方法的形式参数 | 在类中,方法外 |
初始化值 | 有默认初始化值 | 无,先定义,赋值后才能使用 | 有默认初始化值 |
调用方式 | 对象调用 | 无 | 对象调用,类名调用 |
存储位置 | 堆中 | 栈中 | 方法区 |
生命周期 | 与对象共存亡 | 与方法共存亡 | 与类共存亡 |
别名 | 实例变量、全局变量 | 无 | 类变量 |
(注意:成员变量和全局变量也有一些区别,如下图)(这个我还不太理解,也没有找到很清晰的解答,不过现在可以默认为相同的概念)
- 说到这里,对于最初那个在蓝墨云班课上的问题解答是:因为在使用变量时需要遵循的原则为:就近原则,所以在一个方法中有与成员变量同名的局部变量,则该方法对这个变量名的访问是局部变量。
对于以上问题,可继续深入探索:
可参考以下几篇精选文章:
1.static静态变量的理解
2.成员变量、类变量、局部变量的区别
3.JAVA成员变量的访问权限- 问题2:
在蓝墨云班课上大致了解了匿名对象的使用方法后,了解到匿名对象的一次性。既然匿名对象会被分配到堆内存,分配到内存后运行一次就变成垃圾了,那么创建匿名对象到底有何意义? 问题2解决方案:
通过搜索引擎,我大致了解到匿名对象通常在对象的方法只调用一次时使用,因为这样写比较简化。如果对一个对象进行多个成员的调用,就必须给这个对象起个名字。
后来又进行了思考:匿名对象可以不定义对象的引用名称,而去直接调用这个对象的方法,并且分配到内存后运行一次就变成垃圾了,而Java又会自动完成垃圾收集,所以使用匿名对象可能可以节省栈内存。
(此问题仍然有待于思考和验证)问题3:对于课本中的return语句的用法有些模糊。
问题3解决方案:
结合上周阅读的资料和课本内容,return语句的用法总结如下:
1.由保留字return再加一个表达式组成,表达式代表要返回的值;
2.return 从当前的方法中退出,返回到该调用的方法的语句处,继续执行;
3.return 返回一个值给调用该方法的语句,返回值的数据类型必须与方法的声明中的返回值的类型一致;
4.return 后面也可以不带参数,不带参数就是返回空,其实主要目的就是用于想中断函数执行,返回调用函数处。问题4:听娄老师大致讲解了伪代码,又看了课本上的算法中的伪代码,想要加深理解伪代码。
问题4解决方案:查找相关资料,总结如下:
1.伪代码由中文和英文混合组成,能够更好地表达算法;
2.在伪代码中,每一条指令占一行(else if,例外)。指令后不跟任何符号(Pascal和C中语句要以分号结尾)。书写上的“缩进”表示程序中的分支程序结构;
3.举个简单的例子:
IF 九点以前 THEN
do 私人事务;
ELSE 9点到18点 THEN
工作;
ELSE
下班;
END IF
- 这样不但可以达到文档的效果,同时可以节约时间. 更重要的是,使结构比较清晰,表达方式更加直观。
更详细的介绍参考:伪代码的写法
代码调试中的问题和解决过程
问题1:算是一个程序调试的问题,关于eclipse在虚拟机上运行错误的问题。(如下图)
在终端上显示:
问题1解决方案:查找相关资料,并在博客园发问。
我先查找了相关资料,上面显示了一些解决办法:我依次尝试了之后发现每一种方法都无法保存:
于是王志强老师指出了我的错误:我直接在文件夹里搜索相关的ini文件,并双击打开进行修改,但是因为权限问题无法修改,所以直接修改/etc目录下的文件,肯定无法保存。所以必须使用root权限修改。
即sudo vim /etc/eclipse.ini运用vim编辑器修改后,我发现仍然无法打开eclipse:
网上还说到关于jdk版本的问题,我检查之后发现没有问题:
之后王老师又给出了一些解决方法的链接,详见关于在虚拟机上启动eclipse的问题。
我依次尝试后,又出现了新的错误:
我查询了一些方法并修改仍然无法打开,其中还反复重装了几次eclipse。ls -s /*
和cp * /swt
的方法都试过。
我没有在计算机中找到原文件,只找到了几个eclipse.platform_3.8的文件:
在网上查到的原因有:缺少usr中swt 的配置文件,更新config文件,还有删除eclipse下的update文件,都试过了(还有之前尝试了删除eclipse.ini文件的方法之后仍然错误,于是重装了eclipse,但是想查看ini文件显示无法查看,显示文件损坏,点击用vim查看之后自动消失了),但是仍然没有解决问题。
最后王老师让我换一个版本,我还没有尝试,不过在win10上下载的eclipse可以正常运行。
不得不说,解决这个问题真的很痛苦。不过我也确实学到了一些东西,在查找与内存大小有关的资料时,有一篇微博写得比较详细又比较短小,主要解释了各个参数的含义,参考:eclipse无法启动(eclipse.ini配置)- 问题2:这个问题比较低级,之前在第七章的时候就没有理解为什么要将两个或三个程序编译之后,要选择其中的一个运行而不是另外的几个运行。
问题2解决方案:
在听了蓝墨云班课上的解释后大致理解了,原因如下:
因为Java的程序运行都是从主函数开始的,而另外的几个程序都没有主函数的定义,所以要运行这个含有主函数的程序。
我实践了一下,如果运行另外的一个缺少主函数的程序,会出现以下编译错误:
代码托管
- 代码提交过程及代码量截图:week5
(statistics.sh脚本的运行结果截图)
上周考试错题总结(答案已用绿色字体标注)(本次错题没能够全部深入思考)
错题1:Which of the following lines of code accesses the second element of the first array in a two-dimensional array of integers, numbers, and stores the result in a variable called num?(下面哪条语句访问了一个整型二维数组numbers的第二个元素,并把值存入num变量中)
A .num = numbers[1][2];
B .num = numbers[0][1];
C .num = numbers.getElement(1, 2);
D .num = numbers.getElement(0, 1);
E .none of the above are correct
错误原因:不熟悉数组中的数据存入。
解析:选b访问数组的第一个第二个元素。选择第二个数组的访问第三个元素。选择c和d不代表有效的Java语法。错题2:Suppose we have an array of String objects identified by the variable names. Which of the following for loops will not correctly process each element in the array.(假如我们有一个名为names的String对象数组,下面哪个for循环不能遍历数组中的每一个元素?)
A .for(int i = 0; i < names.length; i++)
B .for(String name : names)
C .for(int i = 0; i < names.length(); i++)
D .none of these will correctly process each element(以上都不能遍历)
E .all of these will correctly process each element(以上都能遍历)
错误原因:不熟悉数组中的边界检查。
解析:选c不会正确地处理每个元素由于语法错误。长度变量不是一个方法,因此,没有括号。选b是一个例子,一个数组,使用foreach循环过程和选择a是一个正确的for循环。
加深理解:仔细看了课本后,与课本第三章中的String类的length()方法对比,认为:这里的length与其不一样,length在数组中是数组对象的属性,是一个常量,所以和String类中的方法不一样,在这里不用加括号。
如果加了括号,那么编译时会显示:- 错题3:Which of the statements is true about the following code snippet?(对于下面的代码段,说法正确的是?)
int[] array = new int[25];
array[25] = 2;
A .The integer value 2 will be assigned to the last index in the array.(整数2会赋给数组中最后一个元素)
B .The integer value 25 will be assigned to the second index in the array.(整数25会赋给数组中的第2个索引)
C .The integer value 25 will be assigned to the third value in the array. (整数25会赋给数组中的第3个元素)
D .This code will result in a compile-time error.(代码会产生编译时错误)
E .This code will result in a run-time error. (代码会产生运行时错误)
错误原因:不熟悉数组中的赋值表达。
解析:这段代码会抛出ArrayIndexOutOfBoundsException,自从上次在这个数组索引将24。这将导致一个运行时错误。错题4:Suppose we wanted to process a text file called “input.txt” using the Scanner object. Which of the following lines of code correctly creates the necessary Scanner object?(假如我们想用Scanner对象处理文件名为“input.txt”的文本文件,下面哪行代码正确的创建了Scanner对象)
A .Scanner inputFile = new Scanner(“input.txt”);
B .Scanner inputFile = new Scanner(new InputFile(“input.txt”);
C .Scanner inputFile = new Scanner(new File(input.txt);
D .Scanner inputFile = new Scanner(new InputFile(input.txt);
E .Scanner inputFile = new Scanner(new File(“input.txt”);
错误原因:不熟悉Scanner类中对文本文件的处理表达。
知识点:File
Scanner
解析:扫描仪构造函数需要一个引用一个文件对象作为一个参数,所以选择a,b和d是不正确的。一个文件对象的构造函数接受一个字符串,所以选择c是不正确的。因此,选择是正确的。错题5:Which of the following statements best describes the flow of control in the main method of a Java program that has no conditionals or loops? (在没有条件和循环语句的情况下,对于Java程序中main方法的描述,下面哪个选项最为合适?)
A .Program statements are all executed at the same time.(程序语句同时执行)
B .Program statements are executed according to their priority, which is specified by the programmer.(程序语句根据程序员指定的优先级按优先级执行)
C .Program statements are executed linearly, with earlier statements being executed first.(程序语句顺序执行,前面的语句先执行)
D .Program statements are executed linearly, with later statements being executed first.(程序语句顺序执行,后面的语句先执行)
E .Some program statements are executed at the same time, and others are executed in a linear manner. (有的程序语句同时执行,有的语句顺序执行)
错误原因:没有仔细思考过程序语句的顺序。
解析:在Java程序中程序语句执行线性当没有条件或循环时。这意味着语句出现在代码语句之前执行代码中出现的较晚。错题6:Which of the following are examples of invalid string literals?(下面哪个字符串字面量是不合法的?)
A .“Hello World!”
B .“4 score and 7 years ago, our forefathers brought forth...”
C .“z”
D .“”
E .none of the above(以上都不对)
错误原因:理解有误,当时在手机上B选项显示了两行,一激动就认为B缺少连接字符串的+号(误把它当成输出程序了)。
解析:一个字符串可以包含任何有效的字符,包括数字数字、标点符号和其他特殊字符。他们也可以包含任何字符。错题7:输入"cd"命令并按回车键后,将会出现什么情况?
A .从当前目录切换到根目录
B .屏幕显示当前目录
C .从当前目录切换为上一级目录
D .从当前目录切换到用户主目录
错误原因:对根目录理解有误。
解析:cd 等价于cd ~,也就是cd /home/userXXX。
结对及互评
点评过的同学博客和代码
- 本周结对学习情况
- 20162329
- 结对学习内容
- 主要是讨论书上的一点概念吧,还有他的代码量问题(已在云班课上提问)我们也有讨论过,然而并没有解决。
- 上周博客互评情况
- 本周(第五周)博客互评情况:
其他(感悟、思考等,可选)
本周任务量比上周减轻了一些,但我没有像上周一样充分利用时间,总是有一部分时间在焦虑着什么,周一到周三看完了蓝墨云班课的视频,并且第一遍看得不是很懂,于是又花时间重新看了一遍,并且做了一些笔记。有一些内容对于我来说,是要经常巩固的。
在周一到周三的时间里,我也适当地结合了课本中的内容,但是觉得课本越看越抽象,于是在周四感到一些焦虑,之前的错题也没看,就又进行了一次考试,结果让我有些压抑。感觉考试的知识点越来越杂乱,所以想要像之前几周一样深入理解每道题很难,但是我仍然会不断改进自己的学习模式,我认为自己这周的焦虑主要来源于上周第七章内容掌握太浅显,还有自身的拖延症(没有及时看错题)。
之后在周五用了一个晚上尝试安装eclipse问题的解决方法,因为我是个完美主义者,我知道生活中没有绝对完美的事物,但是我能做好的事,一定要做到接近完美,这就导致了我花费太多时间在上面,不仅没有实验成功,还因为熬夜影响了第二天的听课效率,又会使我产生一些焦虑,我真的不应该把这么多时间浪费在焦虑上,这种焦虑让我有一种对自己的学习无从下手的感觉。
不过这周由于反复观看了几遍视频,感觉学习效果有一些提升。我会尽量在下周的学习中调整好状态,继续寻找适合自己的学习模式。
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 | |
第一周 | 95/95 | 1/4 | 12/12 | 学会了编写简单的脚本和课本上的java程序 |
第二周 | 512/607 | 1/5 | 14/26 | 学会了Scanner类编写简单的java程序,了解了数据转换相关知识 |
第三周 | 484/1091 | 1/6 | 14/40 | 学会了创建简单的String,Random,Math等类的对象,安装并使用IDEA工具,并且了解了一些java位运算符 |
第四周 | 1176/2267 | 2/8 | 24/64 | 学会了条件及循环语句的基本表达,大致了解数组元素及对象数组的概念 |
第五周 | 838/3105 | 1/9 | 14/78 | 加深了对面向对象、方法结构和类定义的理解 |
尝试一下记录「计划学习时间」和「实际学习时间」,到期末看看能不能改进自己的计划能力。这个工作学习中很重要,也很有用。
耗时估计的公式
:Y=X+X/N ,Y=X-X/N,训练次数多了,X、Y就接近了。
计划学习时间: 16小时
实际学习时间: 14小时
有效学习时间:5小时
改进情况:加长了在蓝墨云班课的学习时间,适当减少了课本内容的学习时间,比较全面地理解面向对象概念,大致了解了适合自己的学习模式。
(有空多看看现代软件工程 课件
软件工程师能力自我评价表)