20155314 2016-2017-2 《Java程序设计》第3周学习总结
教材学习内容总结
学习目标
- 区分基本类型与类类型
- 理解对象的生成与引用的关系
- 掌握String类和数组
- 理解封装的概念
- 掌握构造方法的定义
- 理解重载的概念
- 掌握static的应用
get到的重点
第四章 认识对象
-
关键词:
-
class
:定义类 -
new
:新建一个对象(实例)
-
一个原始码中可以有多个类定义,但只能有一个是公开类,且文档中的主文档名必须与公开类名称相同
只要有一个类定义,编译程序就会产生一个.class文档
定义构造函数:在建立对象时一并进行某个初始流程,像是指定数据成员值
-
标准类的使用:
-
java.util.Scanner
:在“命令提示符”模式下取得用户输入 -
java.math.BigDecimal
:在浮点数运算中得到更好的精确度(Java使用分数与指数来表示浮点数)
-
=是用在指定参考名称参考某个对象,而==是用在比较两个参考名称是否参考同一对象
Long
、Integer
、Double
、Float
、Boolean
、Byte
等类:打包器,提供对象实例作为“壳”,将基本类型打包在对象之中,就像将基本类型当作对象操作自动装箱、拆箱——编译程序蜜糖:编译时期根据所撰写的语法,决定是否进行装箱或拆箱动作
在Java中数组是对象
声明数组时建议将[]放在类型关键词之后(Java开发人员撰写习惯);在声明的参考名称旁加上[]并指定索引,就可以取得对应值,把设定值给数组中某个元素也是通过索引
增强式for循环——编译程序蜜糖
n维数组使用n个索引存取数组元素
使用
new
关键词指定长度建立数组使用
java.util.Arrays
的fill()
方法来设定新建数组的元素值代表建立数组对象的类由JVM动态产生
用
new
建立二维数组:int[][] cords=new int[m][n];
——建立了一个int[][]
类型的对象,里面有2个int[]
类型的索引,分别是参考长度为n的一维数组对象,初始值都是0Java中的多维数组基本上都是由一维数组组成
-
类类型建立数组(每个索引都参考至null):
-
Integer[] scores=new Integer[3];
建立了0个Integer
实例 -
Integer[][] cords=new Integer[3][2];
建立了0个Integer
实例
-
Java中数组一旦建立,长度就固定了
-
数组复制:
- 浅层复制:
System.arraycopy(来源数组,来源起始索引,目的数组,目的起始索引,复制长度)
Arrays.copyOf(来源数组,复制长度)
- 深层复制
- 浅层复制:
对于类类型声明的数组要注意参考的行为
字符串:本质是打包字符数组的对象,是
java.lang.String
类的实例使用+运算来连接字符串
-
字符串特性:
- 字符串常量:用
""
写下的字符串 - 字符串池:以
""
包括的字符串,只要内容(序列、大小写)相同,无论在程序代码中出现几次,JVM都只建立一个String
实例,并在字符串池中维护 - 不可变动字符串:字符串对象一旦建立就无法更改对象中任何内容,对象上没有任何方法可以改变字符串内容
- 字符串常量:用
比较字符串实际字符内容是否相同,不要使用
==
,要使用equals()
第五章 对象封装
类语法细节
- public
- 用在类前
- 用在方法前
- 用在成员变量前
- private:用在成员变量前
- 方法重载(Overload)
- 参数类型和个数不同
- 与返回值无关
- this与super
- final
- 用在类前
- 用在方法前
- 用在成员变量前
- static:所有对象公有的
- 用在类前
- 用在方法前
- 用在成员变量前
- 访问惯例:类名.static成员
- 与C语言中的static区分
教材学习中的问题和解决过程
关于IntelliJ IDEA下命令行自变量的指定
关于命令行自变量,课本P109有如下介绍:
在启动JVM并指定执行类时,可以一并指定命令行自变量。例如:
> java cc.openhome.Average 1 2 3 4
上面这个指令代表启动JVM并执行cc.openhome.Average
类,而Average
类会接受1
、2
、3
、4
这四个自变量,这四个自变量会收集为String
数组,由main()
中的args
参考。
于是我便毫不犹豫地敲入以下代码:
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);
}
}
再毫不犹豫地一编译结果出问题了,输出居然是NaN?这到底是什么东东??顺手百度一下:
- NaN,是Not a Number的缩写,在IEEE浮点数算术标准(IEEE 754)中定义,表示一些特殊数值(无穷与非数值(NaN)),为许多CPU与浮点运算器所采用。
- NaN用于处理计算中出现的错误情况,比如 0.0 除以 0.0 或者求负数的平方根。
其中Java中遭遇NaN和Java中的Infinity和NaN两篇博客分别详细介绍了特殊数字NaN的产生条件、性质属性以及危害等,so professional(>_<)看完之后令人耳目一新~但是,这段代码并未涉及到浮点数运算,因此此处NaN的产生并不属于博客中所列的情况。到底怎么回事呢?再回头看看课本P109的那段代码,哦豁,这次我注意到了代码上边的一句话:
这段代码可以让用户命令行自变量提供整数,计算出所有整数平均:
!!命令行自变量?!让用户提供?!不会类似C语言中的命令行参数吧!这不禁勾起了我的回忆:
#include <stdio.h>
int main(int argc,char *argv[])
{
int i;
printf("The number of command line arguments is:%d\n",argc);
printf("The program name is:%s\n",argv[0]);
if(argc>1)
{
printf("The other arguments are following:\n");
for(i=1;i<argc;i++)
{
printf("%s\n",argv[i]);
}
}
return 0;
}
在C中,main()
通过形参获得命令行参数传递给程序,而命令行参数则用字符指针数组*argv[]
来表示和接收。我还记得命令行参数的程序要在酷炫的DOS命令提示符界面下操作(>_<)虽然在C程序设计基础课上没有过多讲解,但是老师说命令行参数还是很有用的,特别是在批处理命令中使用广泛。而在Java的IDE中也可以指定JVM启动时可用的一些自变量,遗憾的是书上这样写道:
例如在NetBeans中,可以这样设定:
……
什么?!我用的可是IntelliJ啊喂!NetBeans的命令行教程什么鬼!无奈只能再次求助于百度(>_<)好在找到了一篇适合自己用的好教程:怎么在IntelliJ IDEA的输入命令行参数?(How do you input commandline argument in IntelliJ IDEA?)如下图,在macOS中,我们可以control + alt + R
调出Run菜单,按键盘的➡️,然后按E
,回车:
在Program arguments一栏中输入命令行参数(注意用空格隔开),最后点Run就完成啦~
输出1、2、3、4四个数的平均数2.5没毛病!hhh好通俗易懂的教程~
课后习题
所谓“实践是检验认识真理性的唯一标准”,我在IntelliJ IDEA上把教材第三章课后练习题又敲了一遍,给出了自己的答案,并加上了一些自己的分析,通过逐题进行代码调试实践的方式来深入对java类与对象的理解。小白在此恳请大家积极指出错误的地方(>_<)
4.7.1 选择题
-
A 分析:
public class Exercise4711 {
public static void main(String[] args) {
int x=100;
int y=100;
Integer wx=x;
Integer wy=y;
System.out.println(x==y);
System.out.println(wx==wy);
}
} -
A 分析:
public class Exercise4712 {
public static void main(String[] args) {
int x=200;
int y=200;
Integer wx=x;
Integer wy=y;
System.out.println(x==wx);
System.out.println(y==wy);
}
} -
A 分析:
public class Exercise4713 {
public static void main(String[] args) {
int x=300;
int y=300;
Integer wx=x;
Integer wy=y;
System.out.println(wx.equals(x));
System.out.println(wy.equals(y));
}
} -
B 分析:
public class Exercise4714 {
public static void main(String[] args) {
int[] arr1={1,2,3};
int[] arr2=arr1;
arr2[1]=20;
System.out.println(arr1[1]);
}
} -
A 分析:
public class Exercise4715 {
public static void main(String[] args) {
int[] arr1={1,2,3};
int[] arr2=new int[arr1.length];
arr2=arr1;
for(int value:arr2) {
System.out.printf("%d",value);
}
}
} -
C 分析:
- 首先String不属于8种基本数据类型,String是一个对象。 因为对象的默认值是null,所以String的默认值也是null;但它又是一种特殊的对象,有其它对象没有的一些特性。
- new String()和new String(“”)都是申明一个新的空字符串,是空串不是null;
- String str=”kvill”; String str=new String (“kvill”);的区别: 在这里,我们不谈堆,也不谈栈,只先简单引入常量池这个简单的概念。 常量池(constant pool)指的是在编译期被确定,并被保存在已编译的.class文件中的一些数据。它包括了关于类、方法、接口等中的常量,也包括字符串常量。
B
C
-
A 分析:
public class Exercise4719 {
public static void main(String[] args) {
String[][] strs={
{"java","java","java"},
{"java","java","java","java"}
};
System.out.println(strs.length);
System.out.println(strs[0].length);
System.out.println(strs[1].length);
}
} C
代码调试中的问题和解决过程
关于“类重复”的问题
敲代码在敲教材4.3.3数组复制一节的代码时,
DeepCopy时,呃??改了名字还编译不过?仔细一看竟是它!
代码托管
- 运行statistics:
上周考试错题总结
-
Linux Bash中,查找当前目录中前天创建的Java文件的命令是(find . –name *.java -ctime 2)。
- 错误原因:啊没看清题意“当前目录”,直接写成/home/(>_<)
-
~0b1011的十进制值是(-12)。
错误原因:当时根本没有看到前面还有个
~
,真的,于是直接看1011就写11了(>_<)理解情况:经过周三Java课上娄老师详细地讲解之后,我终于明白原来这道题的内幕是这样的:
由于内存是字节数组,0b1011转化为8位二进制码是00001011,~
代表逐位取反,于是~
后便为11110100,有符号数最高位1表示是负数,还需要对它进行求补运算即取反(符号位不变)再+1才能得到其原码,即:~11110100+1=10001011+1=10001100(-12!)这道题如此经典易错,一定会循环考的~!很重要喔!(敲黑板)
P64 Shift.java中第三个printf的输出结果是”2的2次方:4”。(X)
运行p69 Odd.class的命令为(java cc.openhome.Odd)。
其他
其实这周的计划学习时间没有根据实际来制定,本周的学习任务相比前两周要艰巨很多,从自学一章到自学两章,真正实现起来还是有一定难度的,尽管敲完了书上两章的所有代码,但也只是精读第四章,较为粗略的浏览第五章。这两章对初学者来说其实有很多点值得细细推敲,要是学习时间安排地更充裕一些就更好了,同时也希望自己能提高学习效率。
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 | |
第一周 | 34/34 | 1/4 | 12/12 | |
第二周 | 360/394 | 1/5 | 16/28 | |
第三周 | 701/1018 | 1/6 | 19/ 47 |
计划学习时间:15小时
实际学习时间:19小时