20172328李馨雨《程序设计与数据结构》第四周学习总结
教材学习内容总结
第四章:编写类
- 尝试编写不在java类库中的预定义类,定义对象可以实现的方法函数。
- 了解UML这种统一建模语言,学习类名、属性(数据)、操作(方法)之间的关系。
- 学习封装以及实现封装的修饰符(介绍了可见性修饰符中的public和private。在UML中+表示public可见性,-表示private可见性)
- 学习了访问器和修改器方法,访问器为getX,修改器为setX。这里的方法命名习惯将实例变量名的第一个字母大写。
- 了解方法的分析,类由数据声明和方法声明组成,方法是一组编程语句。java程序中的方法是一个类的组成部分。方法声明首部包括返回值类型、方法名及该方法所接受的参数的列表,构成方法体的语句则定义在由花括号定界的范围内。
- 方法的返回值类型必须与方法声明首部规定的返回值类型一致。
- 定义类时,通常要定义一个构造方法以辅助创建类的实例,这个构造方法常用于初始化与每个对象有关的变量。构造方法没有任何返回类型,甚至也没有void类型。
- 调用方法时,将把实参复制给被调方法的形参。
第七章:面向对象设计
- 了解软件开发活动的四个基础过程,即确定软件需求,软件设计,实现软件设计,软件测试。了解伪代码、产品代码、测试语句。
- 静态变量和静态方法,静态变量由所有实例共享。静态方法可以通过类名称来调用。main方法只能访问静态变量或局部变量。
- 类间关系有最基本的三种——依赖、聚合、继承。依赖关系:一个类依赖另一个类的情况称为依赖。一个类的对象含有另一个类的对象叫做继承。
- this引用。this引用可用于当前正在运行的对象。this引用也常用于区分同名的构造方法参数和实例变量。
- java接口是一组常量和抽象方法的集合。接口不能被实例化。可以由多个类实现同一个接口,一个类可以实现多个接口。
- 枚举类型是一种特殊的类,枚举类型的值是对象,也是实例。
- 了解方法分解(将复杂的程序分解为简单的方法累计)和方法参数的传递方式(实参赋给形参的不同类型)和方法重载(使用不同参数表的相同方法名可以调用多个方法)。
教材学习中的问题和解决过程
- 问题1:变量的作用域是什么?
- 1.(〃‘▽‘〃)本题解答:变量的引用范围是该变量在程序中可以引用的区域。声明在类级的实例变量,可以被类中的任何方法引用。声明在一个特定方法中的局部变量(包括形式参数),都只能被该方法引用。
- 问题2:return语句怎么使用?为什么不能一次返回多个实际参数?
- 2.(〃‘▽‘〃)本题解答:方法的返回值类型必须与方法声明首部中规定的返回值类型一致。当方法不返回任何值时,用void作为返回值类型。一条return语句由保留字return和后续的可选表达式组成。执行return语句时,控制立即返回到调用方法,并返回表达定义式的返回值。
- 问题3:静态变量和静态方法有什么区别?
3.(〃‘▽‘〃)本题解答:
静态变量有两种情况:
静态变量是基本数据类型,这种情况下在类的外部不必创建该类的实例就可以直接使用
静态变量是一个引用。这种情况比较特殊,主要问题是由于静态变量是一个对象的引用,那么必须初始化这个对象之后才能将引用指向它。
因此如果要把一个引用定义成static的,就必须在定义的时候就对其对象进行初始化。静态方法:与类变量不同,方法(静态方法与实例方法)在内存中只有一份,无论该类有多少个实例,都共用一个方法。
静态方法与实例方法的不同主要有:
静态方法可以直接使用,而实例方法必须在类实例化之后通过对象来调用。在外部调用静态方法时,可以使用“类名.方法名”或者“对象名.方法名”的形式。实例方法只能使用后面这种方式。
静态方法只允许访问静态成员。而实例方法中可以访问静态成员和实例成员。
静态方法中不能使用this(因为this是与实例相关的)。- 问题4:依赖关系和聚合关系之间的差异。
- 4.(〃‘▽‘〃)本题解答:依赖关系是一个类“使用”另一个类,即一个类的方法调用另一个类的方法。当一个类实例化另一个对象时,就获得了该对象的访问权。当时不太懂左边两句表达的意思。
依赖与聚合的区别,通过老师上课讲解和找到的这篇博客,能够理解。 - 问题5:解释一个类如何与其自身相关联。
- 5.(〃‘▽‘〃)本题解答:通过一个对象来调用的方法,可以与该对象同类型的对象作为参数。例如:通过一个String对象调用String类的concat方法时,concat方法接受一个String对象作为参数。
- 问题6:实现一个接口的类只能定义在那些包含接口中的方法?
6.(〃‘▽‘〃)本题解答:不对,尽管实现一个接口的类必须定义那些包含在接口中的方法,但在接口中可以定义额外的方法。
代码调试中的问题和解决过程
问题1:刚开始在实验课上编写Book类以及运行程序Bookshelf时就一直错误不断,而且没有注意到老师要求的可见性修饰符的运用,总是无法编译成功。后来发现是对问题的理解不够深入。
- 1.(〃‘▽‘〃)本题解答:Book类中定义的书名、作者、出版社和版权日期都是在类中新构建的方法。所以说每次return是只能返回一个值的,不能把所有方法通用。除了静态类,可以使用例如
public void setFaceValue(int a1,int a2)
来解决。在Book类最后的toString方法中,定义了四个输出,因此在其驱动类中应输入相对应的四个类型。 问题2:在做pp4.9(
对没错就是那个PairOfDice类)时,没有理解由两个Die对象组成,于是自己编些了一个新类,没有用到Die类的对象。然后编译成功了,但是但是!驱动类型的输出及其魔性,不仅没有将两个随机值相加,还在我设定的setFaceValue方法下出现了看不懂的怪东西。见下图。
2.(〃‘▽‘〃)本题解答:抱着一丝希望和很多丝绝望(
整整花了一个晚上),去请教了蒋子行同学。经过他分析,我的那个驱动程序中随机摇了两次骰子,所以在下面引用时看起来不是相加值,只需要再定义两个量,将上面第一次随机摇出的数值记录,然后输出相加。而输出的很奇怪的一串是因为我没有使用字符串化方法,所以直接输出了地址,这个问题需要在类中重新加上一个toString方法。
问题3:在练习7.4时,出现了史无前例的大量错误,订正书很多很多遍还是自己找不到错误。
- 3.(〃‘▽‘〃)本题解答:求助学长的帮助。获得了一个很好的经验,就是先把虚拟机上的文件
git push
到码云上,然后在git pull
到idea上就可以很快速的查找问题所在原因了。最后仅仅是少了一个if语句下的大括号,这个问题不仅仅提醒我们在编程过程中一定要注意格式,最为主要的是认真理解每一小段代码的真正含义,这样就可以减少不少错误。 - 问题4:在课堂上对老师编译类和运行类的命令理解不透彻。老师用了
javac -d bin -cp bin/week4 src/week4/RationalTest
,当时只知道当新的驱动类编译时,一定要将其放在同一文件夹下否则不能成功。 4.(〃‘▽‘〃)本题解答:在晚自习找老师答疑。老师是利用上述命令在编译驱动型java文件时,自动按照路径去寻找类所编译好的class文件,也就是说,其实可以将class文件和java文件分开,但是在使用时要利用命令搭桥。
代码托管
上周考试错题总结
- 问题1: In Java a variable may contain
A . a value or a reference
B . a package
C . a method
D . a class
E . any of the above - 问题1分析和领悟:这道题正确答案是A,因为Java变量包含对类实例化(内含值和/或附加引用)的值或引用。
- 问题2:Which properties are true of String objects?
A . Their lengths never change
B . The shortest string has zero length
C . Individual characters within a String may be changed using the replace method
D . The index of the first character in a string is one
E . Only A and B are true - 问题2分析和领悟:这道题完全是点错了,我自己选的也是正确答案E,不过值得好好总结。String里面的对象一旦创建后就不能改变,字符串是不可变的。因此,字符串的长度在创建后不会改变。最短的长度字符串是"在引号之间没有字符,所以长度是0。replace方法允许从原来的一个字符串中创建一个新的字符串,替换一些字符,但是位数不变。字符串中第一个位置的索引是0,而不是1。另外,每个字符串的最后一个字节包含字符串末尾字符,它是低值或二进制0的字节。
- 问题3:In the StringMutation program shown in Listing 3.1, if phrase is initialized to "Einstein" what will Mutation #3 yield if Mutation #1: mutation1 = phrase.concat(".")?
A . Einstein.
B . EINSTEIN.
C . XINSTXIN.
D . einstein.
E . xinstxin. 问题3分析和领悟:这道题完全是没有仔细分析,完全忽略了很重要的toUppercase方法,其实很简单。以下是列举出的String的几个基本方法。
char charAt(int index) 返回索引处的字符。 int compareTo(String str)返回一个整型值,负值、0、正值分别表示本对象的字符串按字典顺序位置先于、等于、后于str对象的字符串。 String concat(String str)返回一个本对象字符串与str对象字符串拼接后的新字符串。 boolean equals(String str)如果本对象字符串与str字符串相同(区分大小写),返回真,否则假。 boolean equalsIgnoreCase(String str)如果本对象与str字符串相同(不区分大小写),返回真,否则假。 int length()返回本对象字符串所包含的字符个数。 String replace(char oldchar ,char newchar)将本对象字符串用新字符串替换后,构成新字符串后返回。 String substring(int offset, int endIndex) 返回字符串中从索引offset开始、到endindex-1处的字串。 String toLowerCase()将字符串中的所有大写字母转换成对应的小写字母后,返回该字符串。 String toUpperCase()将字符串中的所有小写字母转换成对应的大写字母后,返回该字符串。
- 问题4: Which of the following will yield a pseudorandom number in the range [ -5, +5 ) given the following:
Random gen = new Random( );
A . gen.nextFloat( ) * 5
B . gen.nextFloat( ) * 10 - 5
C . gen.nextFloat( ) * 5 - 10
D . gen.nextInt( ) * 10 - 5
E . gen.nextInt(10) - 5 - 问题4分析和领悟: float nextFloat() 返回一个分布在【0.0,1.0)区间的浮点随机数。
- 问题5: Consider the following two lines of code. What can you say about s1 and s2?
String s1 = "testing" + "123";
String s2 = new String("testing 123");
A . s1 and s2 are both references to the same String object
B . the line declaring s2 is legal Java; the line declaring s1 will produce a syntax error
C . s1 and s2 are both references to different String objects
D . s1 and s2 will compare "equal"
E . none of the above - 问题5分析和领悟: 这两个声明都是合法的Java。s1是一个字符串引用,它被初始化为字符串“testing123”。s2是一个字符串引用,它被初始化为字符串“testing 123”。注意“testing”和“123”之间的空格。所以这两个字符串不相等。
- 问题6: The advantage(s) of the Random class‘ pseudo-random number generators, compared to the Math.random method, is that
A . you may create several random number generators
B . the generators in Random are more efficient than the one in Math.random
C . you can generate random ints, floats, and ints within a range
D . you can initialize and reinitialize Random generators
E . all but answer B - 问题6分析和领悟: 随机数字发生器的效率是一样的。随机生成器优于数学的优点。随机包含所有其他属性。
- 问题7:Consider the following enumeration
enum Speed { FAST, MEDIUM, SLOW };
A . The ordinal value of MEDIUM is 2
B . The ordinal value of SLOW is 1
C . The name of the Speed enumeration whose ordinal value is zero is FAST
D . The name of the Speed enumeration whose ordinal value is one is SLOW
E . None of the above - 问题7分析和领悟:
有些时候有道的翻译不能相信啊,同学们,这是亲身体验啊,好吧,这道题道理是枚举的顺序值从0开始,从左到右的升序排列。 - 问题8:You may use the String replace( ) method to remove characters from a String.
- 问题8分析和领悟: replace()方法仅用其他单个字符替换单个字符。replace()方法不会将字符添加或删除字符串;字符串长度将保持不变。
- 问题9: If you need to import not only the top-level of a package, but all its secondary levels as well, you should write: import package..;
A . true
B . false 问题9分析和领悟: import语句只能用一个(通配符)来使用。如果您还需要导入整套软件包的所有二级级别,那么您必须明确地写出它们:import package.A.;; import package.B.;
其他(感悟、思考等,可选)
这周学习的内容比较繁杂,相对来说比前几张包含面更加广了。这章内容最启迪我的是:不是让我们只去理解,而要拥有一定的动手能力。很多时候看得懂书上的示例,但在自己做的时候漏洞百出,频频失手。所以应当在看懂的情况下多多练习,可能在练习中收获的知识会更加深刻,更加催人前进。至今我很真诚的说,第七章和第四章有些内容没有完全吃透,消化;希望在学习新内容时我能逐步加深理解并将从前遗留的种种问题通通解决。
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | |
---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 |
第一周 | 100/100 | 1/1 | 15/15 |
第二周 | 377/477 | 1/2 | 20/35 |
第三周 | 280/757 | 2/4 | 22/57 |
第四周 | 973/1730 | 1/5 | 35/92 |
参考资料
1.Java程序设计教程(第八版)
2.《Java学习笔记(第8版)》
3.蓝墨云共享班课
4.贴吧问题