zoukankan      html  css  js  c++  java
  • 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小时

    参考资料

  • 相关阅读:
    POJ 2236 Wireless Network(并查集)
    POJ 2010 Moo University
    POJ 3614 Sunscreen(贪心,区间单点匹配)
    POJ 2184 Cow Exhibition(背包)
    POJ 1631 Bridging signals(LIS的等价表述)
    POJ 3181 Dollar Dayz(递推,两个long long)
    POJ 3046 Ant Counting(递推,和号优化)
    POJ 3280 Cheapest Palindrome(区间dp)
    POJ 3616 Milking Time(dp)
    POJ 2385 Apple Catching(01背包)
  • 原文地址:https://www.cnblogs.com/lxy1997/p/6540082.html
Copyright © 2011-2022 走看看