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使用分数与指数来表示浮点数)
=是用在指定参考名称参考某个对象,而==是用在比较两个参考名称是否参考同一对象
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小时
参考资料
- Java中遭遇NaN
- Java中的Infinity和NaN
- 怎么在IntelliJ IDEA的输入命令行参数?(How do you input commandline argument in IntelliJ IDEA?)
- Java字符串类型详解
- JAVA的String 类
- 漫谈deepcopy(深拷贝)和shallowcopy(浅拷贝)
- 反编译与反汇编
- Java学习笔记(第8版)
- 《Java学习笔记(第8版)》学习指导
20155314 2016-2017-2 《Java程序设计》第3周学习总结的更多相关文章
- 20155336 2016-2017-2《JAVA程序设计》第九周学习总结
20155336 2016-2017-2<JAVA程序设计>第九周学习总结 教材学习内容总结 第十六章 JDBC(Java DataBase Connectivity)即java数据库连接 ...
- 20145213《Java程序设计》第九周学习总结
20145213<Java程序设计>第九周学习总结 教材学习总结 "五一"假期过得太快,就像龙卷风.没有一点点防备,就与Java博客撞个满怀.在这个普天同庆的节日里,根 ...
- 20145213《Java程序设计》第二周学习总结
20145213<Java程序设计>第二周学习总结 教材学习内容总结 本周娄老师给的任务是学习教材的第三章--基础语法.其实我觉得还蛮轻松的,因为在翻开厚重的书本,一股熟悉的气息扑面而来, ...
- 20145213《Java程序设计》第一周学习总结
20145213<Java程序设计>第一周学习总结 教材学习内容总结 期待了一个寒假,终于见识到了神秘的娄老师和他的Java课.虽说算不上金风玉露一相逢,没有胜却人间无数也是情理之中,但娄 ...
- 21045308刘昊阳 《Java程序设计》第九周学习总结
21045308刘昊阳 <Java程序设计>第九周学习总结 教材学习内容总结 第16章 整合数据库 16.1 JDBC入门 16.1.1 JDBC简介 数据库本身是个独立运行的应用程序 撰 ...
- 20145330孙文馨 《Java程序设计》第一周学习总结
20145330孙文馨 <Java程序设计>第一周学习总结 教材学习内容总结 刚开始拿到这么厚一本书说没有压力是不可能的,开始从头看觉得很陌生进入不了状态,就稍微会有一点焦虑的感觉.于是就 ...
- 20145337 《Java程序设计》第九周学习总结
20145337 <Java程序设计>第九周学习总结 教材学习内容总结 数据库本身是个独立运行的应用程序 撰写应用程序是利用通信协议对数据库进行指令交换,以进行数据的增删查找 JDBC可以 ...
- 20145337 《Java程序设计》第二周学习总结
20145337 <Java程序设计>第二周学习总结 教材学习内容总结 Java可分基本类型与类类型: 基本类型分整数(short.int.long).字节(byte).浮点数(float ...
- 20145218《Java程序设计》第一周学习总结
20145218 <Java程序设计>第一周学习总结 教材学习内容总结 今天下午看了Java学习的视频,感觉很是新奇,之前觉得Java学起来是艰难枯燥的,但通过第一章的学习觉得如果自己可以 ...
- 《Java程序设计》第九周学习总结
20145224 <Java程序设计>第九周学习总结 第十六章 整合数据库 JDBC入门 ·数据库本身是个独立运行的应用程序 ·撰写应用程序是利用通信协议对数据库进行指令交换,以进行数据的 ...
随机推荐
- 高并发第十二弹:并发容器J.U.C -- Executor组件FutureTask、ForkJoin
从本章开始就要说 Executor 的东西了.本次讲的是一个很常用的FutureTask,和一个不是那么常用的ForkJoin,我们现在就来介绍吧 引言 大部分时候创建线程的2种方式,一种是直接继承T ...
- 备忘:CSS术语词汇表——张鑫旭
一.叨点什么 写文章的时候经常用到一些CSS方面的专业词汇.但是毕竟芳华年少不在,脑袋有点秀逗了,很多名词都记不住,这种感觉比厕所便秘还难受.比如今天居然记不起来公司公认脸蛋最pp的同事的名字,没想到 ...
- vue2.0 element-ui中input的@keyup.native.enter='onQuery'回车查询刷新整个表单的解决办法
项目中用的element-ui是v1.4.3版本 实现的功能是在input中输入查询的名称,按下键盘回车键,可以查询表格中数据 问题是,我输入名称,按下回车,会整个表单刷新,搜索条件也被清空:代码如下 ...
- HTML5和IOS、Android之间的交互
HTML5向IOS.Android传参: html给native传参需要注意三点: 1.判断终端设备,一般我们都是双系统开发,android和ios语言又不一样:我们需要用不同的方法给他们传递参数: ...
- ArcEngine对Blob字段赋值的方法
今天在测试数据入库程序,发现对某个图层操作之后,调用StopOperation,会出现“尝试写入或读取受保护的内存”错误. 经过测试,最终发现是因为该图层包含有Blob字段,而代码没有专门对Blob字 ...
- 项目maven update 后启动项目出现导常:org.springframework.web.context.ContextLoaderListener
导常:org.springframework.web.context.ContextLoaderListener 1. 右键单击工程项目 ->点击 properties2. 选择 Deploym ...
- Pig limit用法举例
lmt = limit data 10; 只获取指定条数的数据,不能保证每次得到的结果一致,先执行order再limit可以保证一致. 输入数据全部载入. 会触发reduce阶段 a ...
- Asp.net mvc Kendo UI Grid的使用(二)
上一篇文章对Kendo UI做了一些简单的介绍以及基本环境,这篇文章来介绍一下Grid的使用 先上效果图: 要实现这个效果在Controller在要先导入Kendo.Mvc.UI,Kendo.Mvc. ...
- Java简单的数据库连接
package test.postgre; import java.sql.Connection; import java.sql.DriverManager; import java.sql.Res ...
- C# .Net动态调用webService
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Ne ...