20145208《Java程序设计》第3周学习总结

时间:2021-08-23 23:00:00

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,必须有所区别。就像图中那样:

    20145208《Java程序设计》第3周学习总结

  • 不同的构造方法决定了生成对象的方式

    • 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)