20155314 2016-2017-2 《Java程序设计》第3周学习总结

20155314 2016-2017-2 《Java程序设计》第3周学习总结

教材学习内容总结

学习目标

  • 区分基本类型与类类型
  • 理解对象的生成与引用的关系
  • 掌握String类和数组
  • 理解封装的概念
  • 掌握构造方法的定义
  • 理解重载的概念
  • 掌握static的应用

get到的重点

第四章 认识对象

  • 关键词:

    • class:定义类
    • new:新建一个对象(实例)
  • 一个原始码中可以有多个类定义,但只能有一个是公开类,且文档中的主文档名必须与公开类名称相同

  • 只要有一个类定义,编译程序就会产生一个.class文档

  • 定义构造函数:在建立对象时一并进行某个初始流程,像是指定数据成员值

  • 标准类的使用:

    • java.util.Scanner:在“命令提示符”模式下取得用户输入
    • java.math.BigDecimal:在浮点数运算中得到更好的精确度(Java使用分数与指数来表示浮点数)
  • =是用在指定参考名称参考某个对象,而==是用在比较两个参考名称是否参考同一对象

  • LongIntegerDoubleFloatBooleanByte等类:打包器,提供对象实例作为“壳”,将基本类型打包在对象之中,就像将基本类型当作对象操作

  • 自动装箱、拆箱——编译程序蜜糖:编译时期根据所撰写的语法,决定是否进行装箱或拆箱动作

  • 在Java中数组是对象

  • 声明数组时建议将[]放在类型关键词之后(Java开发人员撰写习惯);在声明的参考名称旁加上[]并指定索引,就可以取得对应值,把设定值给数组中某个元素也是通过索引

  • 增强式for循环——编译程序蜜糖

  • n维数组使用n个索引存取数组元素

  • 使用new关键词指定长度建立数组

  • 使用java.util.Arraysfill()方法来设定新建数组的元素值

  • 代表建立数组对象的类由JVM动态产生

  • new建立二维数组:int[][] cords=new int[m][n];——建立了一个int[][]类型的对象,里面有2个int[]类型的索引,分别是参考长度为n的一维数组对象,初始值都是0

  • Java中的多维数组基本上都是由一维数组组成

  • 类类型建立数组(每个索引都参考至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类会接受1234这四个自变量,这四个自变量会收集为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中遭遇NaNJava中的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 选择题

  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);
     	}
     }
    

  2. 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);
     	}
     }
    

  3. 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));
     	}
     }
    

  4. 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]);
     	}
     }
    

  5. 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);
     		}
     	}
     }
    

  6. C 分析:

    1. 首先String不属于8种基本数据类型,String是一个对象。 因为对象的默认值是null,所以String的默认值也是null;但它又是一种特殊的对象,有其它对象没有的一些特性。
    2. new String()和new String(“”)都是申明一个新的空字符串,是空串不是null;
    3. String str=”kvill”; String str=new String (“kvill”);的区别: 在这里,我们不谈堆,也不谈栈,只先简单引入常量池这个简单的概念。 常量池(constant pool)指的是在编译期被确定,并被保存在已编译的.class文件中的一些数据。它包括了关于类、方法、接口等中的常量,也包括字符串常量。
  7. B

  8. C

  9. 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);
     	}
     }
    

  10. 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

参考资料

posted @ 2017-03-12 18:20  20155314刘子健  阅读(404)  评论(3编辑  收藏  举报
Live2D