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

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

教材学习内容总结

一、类与对象

  1. Clothes c1 = new Clothes();将c1名称参考至新建对象(其中Clothes是一个类,c1就是一个对象)
  2. 一个原始码可以有多个类定义,但只有一个是公开类,且文档名称与公开类名称相同
  3. 定义构造函数(与类同名的方法)
  4. 尽量不要在一个类中写多个class,如果有多个class,也只能有一个类前面加public
  5. System.in对象上的int方法,是以int类型返回读入的字符编码。
  6. 标准类
    1. java.util.Scanner不需要每次输入java.util.Scanner,只需要输入Scanner,Scanner中的nextInt()方法会看标准输入中有没有输入下一个字符串,有的话会将之剖析为int类型。
    2. java.math.BigDecimal计算浮点数可以得到更好地精确度,内部提供plus(),substract(),multiply(),divide()方法,例如在整型条件下的a+b+c==0.3在这里写为a.add(b).add(c).equals(0.3)
  7. '='将某个名牌绑到某个对象,'=='将两个名牌绑到同一个对象上
  8. 打包器:为对象提供壳的类,类如Integer中的方法doublValue()可以返回double类型,compareTo()可以让Integer中的两个对象相比较,相同返回0;小于传入对象返回-1,大于返回1;
  9. 自动装箱、拆箱(基本类型):使用Long、Integer、Double、Float、Boolean、Byte等类来打包基本类型,将基本类型当作对象操作。J2SE5.0后可以自动装箱、拆箱。
Integer wrapper =10;//自动装箱
int foo = wrapper;//自动拆箱

封装 = 类 + 访问控制

  • 总结:要产生对象必须先定义类,类是对象的模板,对象是类的实例。定义类使用class关键字,实例化对象使用new关键字。

二、数组

  1. 声明并赋初始值int[] scores={……};
  2. 数组名.length表示数组的长度
  3. Java中数组是对象
  4. 与C语言不同,Java检查数组边界,越界会触发ArrayIndexOutOfBoundsException异常
  5. 操作数组对象:使用new建立数组后,每个索引元素会有默认值,如果默认值不符合需求,则使用java.util.Arraysfill()方法设定新建数组的元素值,代码:
Arrays.fill(scores,60);
    for(int score : scores){
        System.out.printf("%3d",score);
        }

运行结果:

  • 注意用new指定初始值,不必写数组长度
  1. 数组复制
    1. 浅层复制System.arraycopy()Arrays.copyof()
    • scores2 =Arrays.copyOf(scores1,scores1.length)System.arraycopy() 中的五个参数分别是来源数组、来源起始索引、目的数组、目的起始索引、复制长度。
    1. 深层复制
 Clothes2[] c2 = new Clothes2[c1.length];
    for(int i = 0; i < c1.length; i++)
    {
        Clothes2 c = new Clothes2(c1[i].color, c1[i].size);
        c2[i] = c;
    }

三、字符串

  1. 字符串的本质是打包字符数组的对象,是java.lang.String类的实例
  2. length()取得字符串长度
  3. charAt()取得字符串中某个字符
  4. toUpperCase()将原本小写的字符串内容转为大写的字符串内容
  5. 用 "" 写下的字符串称为字符串常量,使用 + 连接字符串会产生新的String实例

四、封装

  1. 封装目的主要是隐藏对象细节。
  2. 使用private定义私有成员,封装了类私有数据,让用户必须通过你提供的操作方法,经过你定义的流程才有可能存取私有数据。
  3. 通过构造方法(构造函数)封装初始化流程
  4. 通过成员方法(函数)封装操作
  5. 通过成员变量封装数据

五、重载

  1. 可以定义多个构造函数,只要参数类型或个数不同。
  2. 定义方法时也可以进行重载,虽然调用的方法名称相同,但根据传递的自变量类型不同,会调用对应的方法

六、this

  1. this代表其所在函数所属对象的引用,简而言之就是this代本类对象的引用,当在函数内需要用到调用该函数的对象时,我们就可以使用this。
  2. this()代表了调用另一个构造函数,至于调用哪个构造函数,则视调用this()时给的自变量类型与个数而定。

七、static关键字

  1. static用于修饰成员(成员变量和成员函数),被声明为static的成员,不会让个别对象拥有,而是属于类。
  2. 在static方法中不能出现this关键字,static方法中不能用非static数据或方法成员。
  3. import static语法是为了偷懒,但要注意名称冲突的问题。

教材学习中的问题和解决过程

  • 问题1:浮点数误差
  • 问题1解决方案:利用BigDecimal
public static void main(String[] args) {
        BigDecimal a=new BigDecimal("0.1");
        BigDecimal b=new BigDecimal("0.1");
        BigDecimal c=a;
        System.out.println(a==b);
        System.out.println(a==c);
        System.out.println(a.equals(b));
    }

运行这段代码会得出如下结果

因为a和b都是浮点数,直接用“”会产生误差,利用BigDecimal中的equals()可以解决这个问题,另外需要注意的是'='和 “”的区别。

  • 问题2 package与project与class

  • 解决方案:百度。上周的git截图没有分目录 =,这周将代码重新按照老师给的目录整理了一下,首先要区分的的就是package与project与class的区别

  • project 是Java的项目,是所做的整个东西的集合,当然也有的大型工程可以是由若干个小项目组合而成的。

  • package 即包管理;是Java用来识别项目中各个类之间的层次关系,一个project项目中可以采用package的方式对你的class(类)进行分层管理,就好象我们在Windows操作系统中常见的文件目录管理一样。

  • project采用package方式管理class

  • 问题3:课本92页代码

public static void main(String[] args) {
        Integer i=10;
        System.out.println(i+10);
        System.out.println(i++);
    }

运行结果如下:

为什么i++不显示11而是10

  • 解决方案
  • 运行
Integer i=0;
    System.out.println(++i);
    System.out.println(i++);

分别显示1和0

  • i=i++是先赋值在自增,所以无论循环多少次,左边的i始终是0,最后结果就是0。这里和C语言有所不同
  • i=++i,++i是先自增在赋值。
  • 问题4:增强式for循环的score和scores
  • 解决方法:增强式for循环
for (int score : scores){
            System.out.printf("score: %d %n",score);
        }

for(数据类型 代表数组中每个元素的名字:数组名)这个score可以是任何名字,这代表代表每次循环时候数组中的每个元素,可以用其他字母代替。

  • 问题5:数组的相关问题
  1. 顺序走访二维数组
public class XY {
    public static void main(String[] args) {
        int[][] cords={
                {1,2,3},
                {4,5,6}
        };
        for(int[] row : cords)
        {
            for(int value : row)
            {
                System.out.printf("%2d",value);
            }
            System.out.println();
        }
    }

其中

  • int[][] cords
  1. 将数组1指给数组2,数组1中的对象也会指给数组2
int scores2=scores1;
scores2[0]=99;
 System.out.println(scores1[0]);
  • 无论score1怎么初始化,运行结为99
  • 因为数组是对象,scores1和scores2是参考名称,将scores1指给scores2,是将scores1参考的对象也指给scores2参考,(scores1和scores2共同指向同一个对象)
  1. 二维数组也可以是不规则的数组,直接定义即可。
int[][] arr=new int[2][];
    arr[0]=new int[] {1,2,3,4,5};
    arr[1]=new int[] {1,2,3}; 
    for(int[] row:arr)
        {
        for(int value:row)
        {
            System.out.printf("%2d",value);
        }
        System.out.println();
  • 问题6:String/StringBuffer/StringBuilder的区别
  • String:字符串常量,字符串长度不可变。
  • StringBuffer:字符串变量,可以频繁对字符串内容进行修改,使用 StringBuffer 类时,每次都会对 StringBuffer 对象本身进行操作,而不是生成新的对象并改变对象引用。
  • StringBuilder:字符串变量(非线程安全)。在内部,StringBuilder对象被当作是一个包含字符序列的变长数组。StringBuilder > StringBuffer
  • 如果要操作少量的数据,用String ;单线程操作大量数据,用StringBuilder ;多线程操作大量数据,用StringBuffer
  • 问题7:Java中怎么实现数字与数字字符串的互换
  • 解决方案:(不理解)
  • 123->“123”:int atoi(String nptr)
  • “123”->123String itoa(int value, int radix)

代码调试中的问题和解决过程

  • 问题1:课本85页利用构建函数指定对象的成员,编译时出现了如图所示的错误提示:

  • 解决方案:删去如图所示代码后毕通过正常运行原因未知

  • 问题2:运行87页代码时产生如下错误提示

  • 解决方案:改变原来代码目录之后,没有改package……这句代码,导致运行错误,应该改为package chapter04.src

  • 问题3:数组复制

int[] scores1={88,66,48,99,12,45,55,76};
int[] scores2=scores1;

用上面这个代码不能复制数组,复制应该是出现两个内容相同的对象,但这只是让两个变量指向了同一个对象,也就是对象只有一个,并没有两个。所以真正的复制应该是这样的:

int[] scores1={88,66,48,99,12,45,55,76};
int[] scores2=new int[scores1.length];
for(int i=0;i<scores1.length;i++){
    scores2[i]=scores1[i];
}
  • 问题4:用Idea上传代码的时候总是出现这样一个警告

  • 解决方案:这是在警告我们需要填写Commit Message,填写后可以上传。

代码托管

  • 代码提交过程截图:

  • 运行(起初Idea没有调试,依然使用了git bash here上传代码,Idea可以给每个代码填注释,今后会使用)

git add .
git commit -m "week03"
git push origin master
  • 并截图

  • 代码量截图:

  • 运行statistics脚本

#!/bin/sh

#by rocedu(http://www.cnblogs.com/rocedu/)

echo "//==========Today====================================="
echo "code summary infomation:"
find . -name "*.java" -mtime 0 | xargs cat | grep -v ^$ | wc -l 
echo "documents summary infomation:"
find . -name "*.md" -mtime 0 | xargs cat | grep -v ^$ | wc -l 
echo "commit history:"
git log --pretty=format:"%h - %an,%ci: %s " | grep  `date +%F`
echo ""
echo ""

echo "//==========This Week================================="
echo "code summary infomation:"
find . -name "*.java" -mtime -7| xargs cat | grep -v ^$ | wc -l 
echo "documents summary infomation:"
find . -name "*.md" -mtime -7| xargs cat | grep -v ^$ | wc -l 
git log --pretty=format:"%h - %an,%ci: %s " | grep  `date +%F --date="-1 days"`
git log --pretty=format:"%h - %an,%ci: %s " | grep  `date +%F --date="-2 days"`
git log --pretty=format:"%h - %an,%ci: %s " | grep  `date +%F --date="-3 days"`
git log --pretty=format:"%h - %an,%ci: %s " | grep  `date +%F --date="-4 days"`
git log --pretty=format:"%h - %an,%ci: %s " | grep  `date +%F --date="-5 days"`
git log --pretty=format:"%h - %an,%ci: %s " | grep  `date +%F --date="-6 days"`
git log --pretty=format:"%h - %an,%ci: %s " | grep  `date +%F --date="-7 days"`
echo ""
echo ""

echo "//==========All================================="
echo "code summary infomation:"
find . -name "*.java"| xargs cat | grep -v ^$ | wc -l 
echo "documents summary infomation:"
find . -name "*.md"| xargs cat | grep -v ^$ | wc -l 
echo "commit history:"
git log --pretty=format:"%h - %an,%ci: %s "

  • 代码量截图

上周考试错题总结

  1. Linux Bash中,查找当前目录中前天创建的Java文件的命令是(find . –name *.java -ctime 2)。注意前天参数为2
  2. 判断: Java中,数字235.00的类型是float. (X)float类型范围为-127~128
  3. 填空:~0b1011的十进制值是(-12)
  4. 判断:Java中,非零数字等价于true.(X)
  5. 0x10%9 的结果是(7)0x10&9 的结果是(0)

其他(感悟、思考等,可选)

上周错题有些多,这周新知识量也比较大,觉得学习起来问题挺多,之后会继续努力。学Java还是要多编代码,建议老师减轻一下每周的学习任务,让我们有更多的时间去编代码练习。

学习进度条

代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
目标 5000行 30篇 400小时
第一周 50/100 1/1 24/24 安装学习Java的一系列软件
第二周 250/300 1/2 30/54 了解Java的基本语法
第三周 552/852 1/3 16/60 了解Java是面向对象的语言

参考:软件工程软件的估计为什么这么难软件工程 估计方法

  • 计划学习时间:20小时

  • 实际学习时间:14小时

参考资料

posted @ 2017-03-12 22:57  lxy1997  阅读(149)  评论(2编辑  收藏  举报