20175314 《Java程序设计》第三周学习总结
教材学习内容总结
编程语言的发展事是从面向机器(汇编、机器)到面向过程(C)再到面向对象(Java)
成员变量:
1、成员变量定义在类中,在整个类中都可以被访问;
2、成员变量随着对象的建立而建立,随着对象的消失而消失,存在于对象所在的堆内存中;
3、成员变量有默认初始化值。
局部变量:
1、局部变量只定义在局部范围内,如:函数内,语句内等,只在所属的区域有效;
2、局部变量存在于栈内存中,作用的范围结束,变量空间会自动释放;
3、局部变量没有默认初始化值 。
在使用变量时需要遵循的原则为:就近原则。
类UML图分为名字层、变量层和方法层。
构造方法的注意事项:名字与类名相同;没有类型;可以有多个构造方法,但是参数需不相同;没有写构造方法,系统会默认只有一个构造方法。
对象(类似C语言的结构体?):创建对象包括对象的声明+分配变量:[类名] [对象名],[对象名] = new 类名,不能使用空对象、[对象].[变量]来对对象进行变量的修改、方法的调用。
一个类声明的两个对象如果有相同的引用,二者就具有完全相同的变量。
Java程序由多个类组成,把这多个类写在不同的源文件中,再把这些源文件放到同一个目录下,之后只要编译主类的源文件,其他相关的源文件也会一起编译,然后主要运行主类的字节码文件就可以得到想要的结果了。这样方便程序的管理和维护。
可变参数用···表示若干参数,他们的类型相同,最后一个参数是参数列表中的最后一个参数,例如public void f(int ...x)。这样的意思是定义了若干个int类型的参数,具体的个数由输入情况决定,达到了动态分配的效果。与数组类似,可以用下标来对可变参数进行操作,如x[0],x[1],而x.length等于x所代表的参数个数(for语句适用)。
对象的组合与复用和C语言的嵌套函数相似。若有两个对象他们的引用相同,改变其中一个对象的变量,另外一个对象的相应的变量也会跟着改变;但是如果改变其中一个对象的引用,那么另外一个对象的引用不变且对象里面的变量会保持。
实例成员和类成员的区别是:实例成员只能通过对象名来调用,而类成员可以通过类名来调用;类成员是所有由这个类创建的对象共同拥有的;类方法只能操作类变量,定义类成员的关键词是static。
方法重载:一个类中有多个方法可以用相同名字,但是它们的参数必须不同,且不能出现歧义调用。
this关键字可以出现在实例方法、构造方法中,不能出现在类方法中。this关键字通常可以省略,只有当成员变量与局部变量相同时不可省略。
包是管理类的一个机制,能够区分名字相同的类。语句为package [包名],要写在源文件的开头。如果源文件没有指定包名,则默认为无名包的一部分。同属于一个目录下的没有指定包名的源文件,他们属于同一个无名包。
在编译和运行无名包时,要注意,源文件和字节码都要在相应包名的目录之下。编译时,进入包名目录的上一层目录,使用javac */[包名]/源文件;运行时,也是进入包名目录的上一层目录,使用java [包名].[类名]。源文件可以不放在包名目录下,但是相应的字节码文件必须放在包名目录下。
可以利用import [包名].[类名]来调用不是同一个包的类。import语句放在package语句和源文件中类的定义之间;也可以带着包名来直接只用其他包的类[包名].[类名] [对象名] = new [包名].[类名]。
包名调用大概有4种情况,处理方式不相同:
1、有包名调用有包名:直接使用import;
2、无包名调用无包名:把他们放在同一个目录下;
3、无包名调用有包名:把有包名的包名目录和无包名的文件放在同一个目录下;
4、有包名调用无包名:不可能实现。
访问限制修饰符有private,protected,public他们都可以用来修饰成员,但是类不能用private,protected来修饰。private使其他类用本类创建的对象不能调用本类的变量和方法。public和protected使其他类用本类创建的对象能调用本类的变量和方法,三者都不加的情况下只有和本类同包的其他类才能调用本类的变量和方法。
教材学习中的问题和解决过程
- 问题1:第四章程序很多,有很多类的名称相同但是都放在一个名为test3的文件夹里,如4-10和4-5的Lader、4-8和4-13的Circle
- 问题1解决方案:修改其中一类的名称并在代码中做出相应修改,或可以为每一个程序都创建一个文件夹(项目)。
- 问题2:没有仔细阅读课本要求,如4-17无要求运行而只是编译并在4-18中运行
- 问题2解决方案:先不急把代码一股脑打到虚拟机上调试运行而先通读一遍课本再开始。
- 问题3:4-20程序代码最后输出形式没有换行不够工整
- 问题3解决方案:可以将System.out.print改成System.out.println或设置一个循环最后加入System.out.println("");
代码调试中的问题和解决过程
- 问题1:修改4-15的Student类为student并调整代码后出现编译错误
- 问题1解决方案:删除public class student{行中的public然后将student.java代码放入Example4_15.java中
- 问题2:遇到有包(package)的程序依然用javac、java编译和运行
- 问题2解决方案:javac -d . [程序名.java]、java [包名].[类名] [程序名]
- 问题3:在用JDB调试的时候输入cont程序就退出了
- 问题3解决方案:应该是因为断点没有命中,但检查了很多遍暂时没找到是哪一步的问题...
代码托管
上周考试错题总结
-
错题1
原因:概念不清
理解情况:全局变量既可以是某对象函数创建,也可以是在本程序任何地方创建。全局变量是可以被本程序所有对象或函数引用
-
错题2
原因:概念不清
理解情况:对象是存放在堆中 变量名存放在栈中。
心得体会
第四章的内容比第二、三章之和还要多,但直到现在只有这次我在周五之前提交了博客,说明人的潜力还是比较大的,但也因为这周内容过多,很多程序我只是把代码输进去编译运行(虽然我认为对于简单代码能够节省无用的时间),这样可能是不对的,果然在4_17和4_22被极其低级的问题耽误了相当多时间,绞尽脑汁地想代码哪里出现了问题,却发现这不是完整的程序,以后还是应该不因完成作业而应付作业,不然这样的学习浅薄又低效。
上周我认为提前完成博客极有可能会让我在周末再难提起学编程的想法,我还是这样认为的,但我还是觉得应该早些把博客写出来,这样才有时间做其他同样重要的事情而不会有焦虑感(这学期需要在周末去驾校练车,平常需要一定的时间学习英语备战六级还有其他学科的学习),每天两三小时的Java时间暂时还不会让我感到难以接受而且对于完成课内的作业任务来说也足够,这可能就是马原上所说的否定之否定吧。同时我发现Java学的越多,和C语言的类似之处也发现的越多。
学习进度条
代码行数 | 博客量 | 学习时间 | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 16篇 | 320小时 | |
第一周 | 51/100 | 1/1 | 12/20 | 基本掌握了Linux的简单指令 |
第二周 | 173/200 | 1/1 | 18/20 | 学习了Java重要基本语法 |
第三周 | 672/800 | 1/1 | 18/20 | 学习了包含多个类的Java程序及类的包机制 |
第四周 |
计划学习时间:20小时
实际学习时间:18小时
改进情况:日积月累不可急功近利