20145208 《Java程序设计》第3周学习总结
教材学习内容总结
认识对象
类类型
- 在第三章的学习中,我了解到JAVA可区分为基本类型和类类型两种类型,在上周的学习中我学习了JAVA的基本类型,在这周学习的就是类类型,这周的学习相对于前两周来说要困难一些,而且所学的知识比较多。
class Clothes{
String color;
char size;
}
public class Field{
public static void main(String[] args){
Clothes sun = new Clothes();
Clothes spring = new Clothes();
}
}
上面的代码中sun和是spring就是类类型变量,类类型指向的就是对象。
类与对象
在本章学习的开始,我最先了解到的是关于类与对象的知识,例子还是上面的代码,代码中的 Clothes sun=new Clothes(),其中的sun和Spring就是引用的类类型变量,new Clothes就是在生成的对象,而且sun也可以近似的看成是指针。
在学习本周内容的初期,我还是不太熟悉类类型的注意事项,比如尽管是在两个JAVA文件中,但在同一个scr文件夹中也不可以有相同的类名,就比如书中的Clothes类,前后出现了多次,但不可以都命名为Clothes,必须有所区别。就像图中那样:
-
不同的构造方法决定了生成对象的方式
- this构造方法:this代表其所在函数所属对象的引用,this代本类对象的引用,当在函数内需要用到调用该函数的对象时,我们就可以使用this。而 this()代表了调用另外一个构造函数。
public class CashCard {
String number;
int balance;
int bonus;
CashCard(String number,int balance,int bonus){
this.number=number;
this.balance=balance;
this.bonus=bonus;
}
}
上述代码就运用了this关键词将参数值指定给了参数number
* new构造方法:用new关键字建立实例来构造。
```
class Clothes{
String color;
char size;
}
public class Field {
public static void main(String[] args) {
Clothes sun =new Clothes();
Clothes spring = new Clothes();
sun.color="red";
sun.size='S';
spring.color="green";
spring.size='M';
System.out.printf("sun(%s,%c)%n",sun.color,sun.size);
System.out.printf("spring(%s,%c)%n",spring.color,spring.size);
}
}
上述代码就是先用class定义了类,然后用new建立实例。
- 封装=类+访问控制(public,protected,private...)
- 我觉得封装是一种对信息的隐藏,用关键字private等来控制用户对类的修改和访问。
public class CashCard2 {
private String number;
private int balance;
private int bonus;
CashCard2(String number, int balance, int bonus) {
this.number = number;
this.balance = balance;
this.bonus = bonus;
}
void store(int money) {
if (money > 0) {
this.balance += money;
if (money >= 1000) {
this.bonus++;
}
} else {
System.out.println("储值是负的?你是乱来的么?");
}
}
int getBalance(){
return balance;
}
int getBonus(){
return bonus;
}
String getNumber(){
return number;
}
}
上述代码便使用了private对参数进行了封装来限制用户对参数的更改。
####标准类
* java.util.Scanner与java.math.BigDecimal两个基本标准类
* java.util.Scanner的nextInt()方法会看标准输入中,有没有输入下一个字符串,有的话会尝试将之剖析为int类型。Scanner对每个基本类型都有对应的方法。
* 使用java.math.BigDecimal可以得到更好的精度。而且用BigDecimal比较相等时,可以直接利用调用add(),再调用equals()比较两个BigDecimal实质上是否相同。
####对象相等
* ==与equals的区别
* ==比较的是对象之间的地址
* equals比较的是逻辑上的相等与否
###基本类型打包
* 如int-Integer;long-Long;byte-Byte;float-Float;double-Double;boolean-Boolean。
###数组对象
* 数组在JAVA中的存在形式就是对象,JAVA会检查数组的边界,越界就会触发ArrayIndexOutOfBoundsException的错误,所以和在C语言中不同,JAVA中的数组的长度在建立的时候就确定了。
* System.arraycopy()与Arrays.copyof()用在类类型声明的数组时,都是执行浅层复制。System.arraycopy()复制的方法是进行数组值的复制,Arrays.copyOf()复制的方法,是建立新的数组。
* 思考题:深拷贝和浅拷贝
* 浅拷贝:只复制一个对象。举例如下
*
class Clothes3{
String color;
char size;
Clothes3(String color,char size){
this.color=color;
this.size=size;
}
}
public class ShallowCopy {
public static void main(String[] args) {
Clothes3[] c1={new Clothes3("red",'L'),new Clothes3("blue",'M')};
Clothes3[] c2=new Clothes3[c1.length];
for (int i=0;i<c1.length;i++){
c2[i]=c1[i];
}
c1[0].color="yellow";
System.out.println(c2[0].color);
}
}
* 深拷贝:对对象内部的引用均复制。
*
class Clothes4{
String color;
char size;
Clothes4(String color,char size){
this.color=color;
this.size=size;
}
}
public class DeepCopy {
public static void main(String[] args) {
Clothes4[]c1={new Clothes4("red",'L'),new Clothes4("blue",'M')};
Clothes4[]c2=new Clothes4[c1.length];
for (int i=0;i<c1.length;i++){
Clothes4 c=new Clothes4(c1[i].color,c1[i].size);
c2[i]=c;
}
c1[0].color="yellow";
System.out.println(c2[0].color);
}
}
###字符串对象
* 字符串本质是打包字符数组的对象。
* 要想比较字符串实际字符内容是否相同,不能使用==,要用equals()。
* 用 "" 写下的字符串称为字符串常量,使用 + 连接字符串会产生新的String实例。
* 可以使用length()取得字符串长度,使用charAt()指定取得字符串中某个字符,使用toUppercase()将原本小写的字符串内容转为大写。
###查询JAVA API文件
* 在Windows系统下,首先要下载CHM格式的Java API。然后参照老师的博客学习。
## 教材学习中的问题和解决过程
在编写代码的时候出现了一个没有解决的问题。
public class Average {
public static void main(String[] args) {
long sum = 0;
for (String arg:args){
sum +=Long.parseLong(arg);
}
System.out.println("平均:"+(float)sum/args.length);
}
}
上述代码的运行结果是![](http://images2015.cnblogs.com/blog/884768/201603/884768-20160320022240974-2007046605.png)
结果是NAN,这不是我想得到的,在网上查到NAN代表not a number,是因为程序中没有给定参数值的原因,但是我想按照书上的方法对其赋予参数变量,却提示无法找到相应的类,这个问题我研究了一会还是没有解决。
![](http://images2015.cnblogs.com/blog/884768/201603/884768-20160320022746037-1007013052.png)
* p88 DecimalDemo.java:修改代码,测试学习效果,比如打印两个整数的乘积
修改后代码如下
import java.math.BigDecimal;
public class DecimalDemo {
public static void main(String[] args) {
BigDecimal operand1=new BigDecimal("1.0");
BigDecimal operand2=new BigDecimal("0.8");
BigDecimal result=operand1.multiply(operand2);
System.out.println(result);
}
}
打印结果
![](http://images2015.cnblogs.com/blog/884768/201603/884768-20160320025348021-1656213326.png)
* Score2.java:把scores填充成{55,65,65,80,75,70,95,90,85,100},测试一下Arrays类的各种排序方法
修改后代码如下
import java.util.Arrays;
public class Score2 {
public static void main(String[] args) {
int[]scores={55,65,65,80,75,70,95,90,85,100};
for (int score:scores){
System.out.printf("%2d ",score);
}
System.out.println();
Arrays.fill(scores,60);
for (int score:scores){
System.out.printf("%3d",score);
}
}
}
结果如图
![](http://images2015.cnblogs.com/blog/884768/201603/884768-20160320030034599-1978131954.png)
* p108 Sum.java:输入11.1试试,会是什么效果?如果有问题怎么解决?
输入了11.1之后出现了错误如图
![](http://images2015.cnblogs.com/blog/884768/201603/884768-20160320030705303-1708131779.png)
阅读之后发现是因为参数定义的是整型,所以只需要修改为浮点数就可以了,代码如下:
import java.util.Scanner;
public class Sum {
public static void main(String[] args) {
Scanner scanner=new Scanner(System.in);
float sum=0;
float number=0;
do {
System.out.print("输入数字:");
number=Float.parseFloat(scanner.nextLine());
sum+=number;
}while (number!=0);
System.out.println("总和:"+sum);
}
}
结果如图,果然可以了:
![](http://images2015.cnblogs.com/blog/884768/201603/884768-20160320030831349-644664789.png)
* p85 Field2.java: 构造方法的使用,构造方法决定了生成对象的方式
按照教学指导上面说的加了一行加一行``Clothes2 autumn = new Clothes2();``发现不能运行;
![](http://images2015.cnblogs.com/blog/884768/201603/884768-20160320024237599-2130983867.png)
原因是实际参数列表和形式参数列表的长度不同,就是新加的一行与形式参数长度存在差异。
## 代码调试中的问题和解决过程
在代码编译中我遇到了GBK码的一些问题,一些包含汉字的文件我在IDEA是可以正常的运行,但是在cmd上运行就会出现错误,下面是任务日志的内容:
![](http://images2015.cnblogs.com/blog/884768/201603/884768-20160320022959990-1161601132.png)
然后我通过上网查找相应的解决方案,发现应该是文件编码方式的问题,只要改成如下方式就可以正常编译运行了:
![](http://images2015.cnblogs.com/blog/884768/201603/884768-20160320023201209-1973195142.png)
## 其他(感悟、思考等)
* 在本周的学习中,我感受到了JAVA学习的压力,但是也感受到了JAVA学习的一些乐趣,这一周学习的内容有一些我还是理解的不够,很多地方不是很熟练,也有一些地方知其然不知其所以然,所以我觉得我需要加强学习的深度,在以后的学习中知其然更要知其所以然,在JAVA的基础学习上掌握一个扎实的基础,我相信对我以后的JAVA学习乃至于其他编程语言的学习都有很大的好处,说实话,我觉得JAVA的这种翻转课堂的学习方式,让我在这一学期的前三周就获益匪浅,让我觉得我在一学期的学习之后肯定可以有一个自己的惊讶的飞跃。
* 所谓付出的越多得到的就越多,我觉得这三周我为JAVA付出的时间和收获真的是这样的,代码写的越多,我对JAVA学习的认识也越多了。这种学习方式对我来说真的是新颖而又有效的,我也想着将这样的方法拓展到其他的科目中。
## 学习进度条
| | 代码行数(新增/累积)| 博客量(新增/累积)|学习时间(新增/累积)|重要成长|
| -------- | :----------------:|:----------------:|:---------------: |:-----:|
| 目标 | 5000行 | 30篇 | 400小时 |成为超过高级初学者的存在 |
| 第一周 | 150/150 | 1/3 | 15/15 |第一个JAVA程序 |
| 第二周 | 150/300 | 2/5 | 20/35 | 第一次对教材代码进行自己的修改 |
| 第三周 | 400/700 | 2/7 | 20/50 | 可以熟练地进行代码托管 |
## 参考资料
- [Java学习笔记(第8版)](http://book.douban.com/subject/26371167/)
- [《Java学习笔记(第8版)》学习指导](http://www.cnblogs.com/rocedu/p/5182332.html)
- [ 我的git代码托管 ](http://git.oschina.net/20145208/java-besti-is-2015-2016-2-20145208/tree/master)
- 代码托管截图如下:
![](http://images2015.cnblogs.com/blog/884768/201603/884768-20160322134425354-914805904.png)
![](http://images2015.cnblogs.com/blog/884768/201603/884768-20160322134439792-1256094683.png)
![](http://images2015.cnblogs.com/blog/884768/201603/884768-20160322134448776-705750155.png)