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

参考资料

20155314 2016-2017-2 《Java程序设计》第3周学习总结的更多相关文章

  1. 20155336 2016-2017-2《JAVA程序设计》第九周学习总结

    20155336 2016-2017-2<JAVA程序设计>第九周学习总结 教材学习内容总结 第十六章 JDBC(Java DataBase Connectivity)即java数据库连接 ...

  2. 20145213《Java程序设计》第九周学习总结

    20145213<Java程序设计>第九周学习总结 教材学习总结 "五一"假期过得太快,就像龙卷风.没有一点点防备,就与Java博客撞个满怀.在这个普天同庆的节日里,根 ...

  3. 20145213《Java程序设计》第二周学习总结

    20145213<Java程序设计>第二周学习总结 教材学习内容总结 本周娄老师给的任务是学习教材的第三章--基础语法.其实我觉得还蛮轻松的,因为在翻开厚重的书本,一股熟悉的气息扑面而来, ...

  4. 20145213《Java程序设计》第一周学习总结

    20145213<Java程序设计>第一周学习总结 教材学习内容总结 期待了一个寒假,终于见识到了神秘的娄老师和他的Java课.虽说算不上金风玉露一相逢,没有胜却人间无数也是情理之中,但娄 ...

  5. 21045308刘昊阳 《Java程序设计》第九周学习总结

    21045308刘昊阳 <Java程序设计>第九周学习总结 教材学习内容总结 第16章 整合数据库 16.1 JDBC入门 16.1.1 JDBC简介 数据库本身是个独立运行的应用程序 撰 ...

  6. 20145330孙文馨 《Java程序设计》第一周学习总结

    20145330孙文馨 <Java程序设计>第一周学习总结 教材学习内容总结 刚开始拿到这么厚一本书说没有压力是不可能的,开始从头看觉得很陌生进入不了状态,就稍微会有一点焦虑的感觉.于是就 ...

  7. 20145337 《Java程序设计》第九周学习总结

    20145337 <Java程序设计>第九周学习总结 教材学习内容总结 数据库本身是个独立运行的应用程序 撰写应用程序是利用通信协议对数据库进行指令交换,以进行数据的增删查找 JDBC可以 ...

  8. 20145337 《Java程序设计》第二周学习总结

    20145337 <Java程序设计>第二周学习总结 教材学习内容总结 Java可分基本类型与类类型: 基本类型分整数(short.int.long).字节(byte).浮点数(float ...

  9. 20145218《Java程序设计》第一周学习总结

    20145218 <Java程序设计>第一周学习总结 教材学习内容总结 今天下午看了Java学习的视频,感觉很是新奇,之前觉得Java学起来是艰难枯燥的,但通过第一章的学习觉得如果自己可以 ...

  10. 《Java程序设计》第九周学习总结

    20145224 <Java程序设计>第九周学习总结 第十六章 整合数据库 JDBC入门 ·数据库本身是个独立运行的应用程序 ·撰写应用程序是利用通信协议对数据库进行指令交换,以进行数据的 ...

随机推荐

  1. 高并发第十二弹:并发容器J.U.C -- Executor组件FutureTask、ForkJoin

    从本章开始就要说 Executor 的东西了.本次讲的是一个很常用的FutureTask,和一个不是那么常用的ForkJoin,我们现在就来介绍吧 引言 大部分时候创建线程的2种方式,一种是直接继承T ...

  2. 备忘:CSS术语词汇表——张鑫旭

    一.叨点什么 写文章的时候经常用到一些CSS方面的专业词汇.但是毕竟芳华年少不在,脑袋有点秀逗了,很多名词都记不住,这种感觉比厕所便秘还难受.比如今天居然记不起来公司公认脸蛋最pp的同事的名字,没想到 ...

  3. vue2.0 element-ui中input的@keyup.native.enter='onQuery'回车查询刷新整个表单的解决办法

    项目中用的element-ui是v1.4.3版本 实现的功能是在input中输入查询的名称,按下键盘回车键,可以查询表格中数据 问题是,我输入名称,按下回车,会整个表单刷新,搜索条件也被清空:代码如下 ...

  4. HTML5和IOS、Android之间的交互

    HTML5向IOS.Android传参: html给native传参需要注意三点: 1.判断终端设备,一般我们都是双系统开发,android和ios语言又不一样:我们需要用不同的方法给他们传递参数: ...

  5. ArcEngine对Blob字段赋值的方法

    今天在测试数据入库程序,发现对某个图层操作之后,调用StopOperation,会出现“尝试写入或读取受保护的内存”错误. 经过测试,最终发现是因为该图层包含有Blob字段,而代码没有专门对Blob字 ...

  6. 项目maven update 后启动项目出现导常:org.springframework.web.context.ContextLoaderListener

    导常:org.springframework.web.context.ContextLoaderListener 1. 右键单击工程项目 ->点击 properties2. 选择 Deploym ...

  7. Pig limit用法举例

    lmt = limit data 10;   只获取指定条数的数据,不能保证每次得到的结果一致,先执行order再limit可以保证一致.   输入数据全部载入.   会触发reduce阶段   a ...

  8. Asp.net mvc Kendo UI Grid的使用(二)

    上一篇文章对Kendo UI做了一些简单的介绍以及基本环境,这篇文章来介绍一下Grid的使用 先上效果图: 要实现这个效果在Controller在要先导入Kendo.Mvc.UI,Kendo.Mvc. ...

  9. Java简单的数据库连接

    package test.postgre; import java.sql.Connection; import java.sql.DriverManager; import java.sql.Res ...

  10. C# .Net动态调用webService

    using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Ne ...