《移动平台开发实践》第三周学习任务

Posted evelynyang

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了《移动平台开发实践》第三周学习任务相关的知识,希望对你有一定的参考价值。

20189230杨静怡 2018-2019-2 《移动平台开发实践》第3周学习总结

学习《Java和android开发学习指南(第二版)》第5、6、8、9章——

第5章核心类
5.1 java.lang.Object

  1. java.lang.Object类表示一个Java对象。实际上,所有的类都直接或间接地派生自这个类。
    5.2 java.lang.String
  2. java.lang.String是最常使用的一个类,并且绝对也是最重要的类之一。一个String对象是常量,一旦创建了,不能修改其值。
  3. 通常将一个字符串字面值赋值给一个String引用变量,而非用关键字构建一个String引用变量。
    5.2.1 比较两个字符串
  4. 使用==操作符比较两个String对象s1和s2。若相同,(s1==s2)计算为true;若不同,(s1==s2)计算为false。
    5.2.2 字符串的字面值
  5. 可以使用加号把两个字符串字面值连接起来:“”+“”;也可以将一个String和一个基本数据类型或其他的对象连接起来:“”+3
    5.2.6 String类的方法
  6. valueOf方法将一个基本类型、一个字符数组或Object的一个实例转换为一个字符串表示。例如,如下的代码返回字符串“23”:String.valueOf(23)。
  7. Format方法允许你传递任意数目的参数。要指定一个参数,使用%s表示法,表示数组中的下一个参数。例如,如下是对printf方法的一次方法调用:
    String firstName=“John”;
    String Lastname=“Adams”;
    System.out.format(“First name: %s. Last name: %s”,
    firstName,lastName);
    5.3 java.lang.StringBuffer和java.lang.StringBuilder
    String对象是不可变的。最好使用java.lang.StringBuffer和java.lang.StringBuilder类。一旦完成了对字符串的操作,可以将一个StringBuffer或StringBuilder对象转换为一个String对象。StringBuffer类是为了可变的字符串而单独使用的,方法同步,适合在多线程环境中使用。StringBuilder是StringBuffer的异步版本。
    5.5 java.lang.Class
    1.代码清单5.1 ClassDemo类
package app05;
public class ClassDemo{
    public static void main(String[] args){
        String country="Fiji";
        Class myClass=country.getClass();
        System.out.println(myClass.getName());
        Class klass=null;
        try{
            klass=Class.forName("app05.Test");
        }catch(ClassNotFoundException e){
        }
        if(klass!=null){
            try{
                Test test=(Test) klass.newInstance();
                test.print();
            }catch (IllegalAccessException e){
            }catch (InstantiationException e){

            }
        }
    }
}

5.6 java.lang.System
1.System类的三个字段是out、in和err:
out字段表示标准的输出流;
err字段也表示一个PrintStream对象,默认情况下,输出也会从当前调用Java程序的地方通向控制台。其目的是显示那些应该立即引起用户注意的错误消息;
in字段表示输入标准流。
2.代码清单5.2 InputDemo类

public class Employee{
  public int age;
  public double salary;
  public Employee(){
  }
    public Employee(int ageValue, double salaryValue){
      age=ageValue;
      salary=salaryValue;
    }
  }

4.7 java.util.Scanner
1.可以使用Scanner来获取键盘输入,在实例上调用next方法。next方法会缓存用户从键盘或其他设备输入的字符。
2.代码清单5.3 使用Scanner来接受用户输入

package app05;
import java.util.Scanner;

public class ScannerDemo{
    public static void main(String[] args){
        Scanner scanner=new Scanner(System.in);
        while(true){
            System.out.print("What's your name?");
            String input=scanner.nextLine();
            if(input.isEmpty()){
            break;
            }
            System.out.println("Your name is"+input+".");
        }
        scanner.close();
        System.out.println("Good bye");
    }
}

技术图片

第6章 数组
6.1 概览
1.每次创建一个数组,在后台,编译器都要创建一个对象以允许:
(1)通过length字段来获取数组中的元素的数目。
(2)通过指定一个索引来访问每一个元素。
一个数组是一个Java对象。
6.5 查找一个数组
1.代码清单6.1 一个二分查找的示例

package app06;
import java.util.Arrays;

public class BinarySearchDemo{
    public static void main(String[] args){
        int[] primes={2,3,5,7,11,13,17,19};
        int index=Arrays.binarySearch(primes,13);
        System.out.println(index);
        index=Arrays.binarySearch(primes,4);
        System.out.println(index);
    }
}

代码清单6.1中的BinarySearchDemo类使用了一个int类型的数组,它包含了前8个素数。传入13作为查找键,将会返回5,因为13是该数组中的第6个元素,其索引为5.传入4作为查找键,将会找不到匹配,该方法返回-3.这是-2减去1的结果。如果要将该键插入到数组中的话,它本应该插入到索引2的位置。
6.6 给main方法传入一个字符串数组
1.代码清单6.2 访问main方法的参数

package app06;
public class MainMethodTest{
    public static void main(String[] args){
        for (String arg:args){
        System.out.println(arg);
        }
    }
}

6.7 多维数组
1.代码清单6.3 一个多维数组

package app06;
import java.util.Arrays;

public class MultidimensionalDemo{
    public static void main(String[] args){
        int[][] matrix=new int[2][3];
        for(int i=0;i<2;i++){
            for(int j=0;j<3;j++){
                matrix[i][j]=j+i;
            }
        }
        for(int i=0;i<2;i++){
            System.out.println(Arrays.toString(matrix[i]));
            
        }
    }
}

第8章错误处理
8.1 捕获异常
1.try通常和catch和finally使用。错误处理的步骤可以概括如下:
(1)将可能导致一个错误的代码隔离到一个try语句块中。
(2)对于每一个单个的catch语句块,编写出如果try语句块中发生特定类型的一个异常,将要执行的代码。
(3)在finally语句块中,编写出不管是否发生错误都将运行的代码。
2.代码清单8.1 NumberDoubler类

package app08;
import java.util.Scanner;

public class NumberDoubler{
    public static void main(String[] args){
        Scanner scanner=new Scanner(System.in);
        String input=scanner.next();
        try{
            double number=Double.parseDouble(input);
            System.out.printf("Result:%s",number);
        }catch(NumberFormatException e){
            System.out.println("Invalid input.");
        }
        scanner.close();
    }
}

技术图片

第九章操作数字
9.1 装箱和拆箱
1.将一个基本类型转换为一个包装类对象,称为装箱(boxing);从一个包装类对象转换为基本类型,称为拆箱(unboxing)。
装箱——

Integer number=3;//assign an int to Integer

拆箱——

Integer number=new Integer(100);
int simpleNumber=number;

9.2 数字解析
1.数字解析的目的是将一个字符串转换为一个数字基本类型。如果解析失败,例如,由于字符串不是一个数字或者是一个超出了指定范围的数字,程序将会抛出一个异常。
2.代码清单9.1 解析数字(NumberTest.java)

package app09;
import java.util.Scanner;

public class NumberTest{
    public static void main(String[] args){
        Scanner scanner=new Scanner(System.in);
        String userInput=scanner.next();
        try{
           int i=Integer.parseInt(userInput);
           System.out.println("The number entered:"+i);
        }catch(NumberFormatException e){
        System.out.println("Invalid user input");
        }
    }
}

9.3 数字格式化
1.代码清单9.2 NumberFormatTest类

package app09;
import java.text.NumberFormat;
import java.util.Locale;

public class NumberFormatTest{
    public static void main(String[] args){
        NumberFormat nf=NumberFormat.getInstance(Locale.US);
        System.out.println(nf.getClass().getName());
        System.out.println(nf.format(123445));
    }
}

技术图片

9.6 计算货币
1.float和double都不适合于计算货币。
2.代码清单9.3 使用BigDecimal

package app09;
import java.math.BigDecimal;

public class BigDecimalDemo{
    public static void main (String[] args){
        double balance=9.99;
        balance-=0.10F;
        System.out.println(balance);

        BigDecimal balance2=BigDecimal.valueOf(9.99);
        BigDecimal accountFee=BigDecimal.valueOf(.1);
        BigDecimal r=balance2.subtract(accountFee);
        System.out.println(r.doubleValue());
    }
}

9.7 生成随机数
1.代码清单9.4 随机数生成器

package app09;
public class RandomNumberGenerator{
    public int generate(){
        double random=Math.random();
        return(int)(random*10);
    }
    public static void main(String[] args){
        RandomNumberGenerator generator=
            new RandomNumberGenerator();
        for(int i=0;i<10;i++){
            System.out.println(generator.generate());
        }
    }
}

技术图片

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

  • 问题:对Java中错误和异常的部分知识掌握不清
  • 问题解决方案:在网上查找相关资料并学习总结:
    Java把异常当作对象来处理,并定义一个基类java.lang.Throwable作为所有异常的超类。在Java API中已经定义了许多异常类,这些异常类分为两大类,错误Error和异常Exception。Java异常层次结构图如下图所示:
    技术图片

从图中可以看出所有异常类型都是内置类Throwable的子类,因而Throwable在异常类的层次结构的顶层。
接下来Throwable分成了两个不同的分支,一个分支是Error,它表示不希望被程序捕获或者是程序无法处理的错误。另一个分支是Exception,它表示用户程序可能捕捉的异常情况或者说是程序可以处理的异常。其中异常类Exception又分为运行时异常(RuntimeException)和非运行时异常。
Java异常又可以分为不受检查异常(Unchecked Exception)和检查异常(Checked Exception)。
Error:Error类对象由 Java 虚拟机生成并抛出,大多数错误与代码编写者所执行的操作无关。例如,Java虚拟机运行错误(Virtual MachineError),当JVM不再有继续执行操作所需的内存资源时,将出现 OutOfMemoryError。这些异常发生时,Java虚拟机(JVM)一般会选择线程终止;还有发生在虚拟机试图执行应用时,如类定义错误(NoClassDefFoundError)、链接错误(LinkageError)。这些错误是不可查的,因为它们在应用程序的控制和处理能力之外,而且绝大多数是程序运行时不允许出现的状况。对于设计合理的应用程序来说,即使确实发生了错误,本质上也不应该试图去处理它所引起的异常状况。在Java中,错误通常是使用Error的子类描述。
Exception:在Exception分支中有一个重要的子类RuntimeException(运行时异常),该类型的异常自动为你所编写的程序定义ArrayIndexOutOfBoundsException(数组下标越界)、NullPointerException(空指针异常)、ArithmeticException(算术异常)、MissingResourceException(丢失资源)、ClassNotFoundException(找不到类)等异常,这些异常是不检查异常,程序中可以选择捕获处理,也可以不处理。这些异常一般是由程序逻辑错误引起的,程序应该从逻辑角度尽可能避免这类异常的发生;而RuntimeException之外的异常我们统称为非运行时异常,类型上属于Exception类及其子类,从程序语法角度讲是必须进行处理的异常,如果不处理,程序就不能编译通过。如IOException、SQLException等以及用户自定义的Exception异常,一般情况下不自定义检查异常。

Error和Exception的区别:Error通常是灾难性的致命的错误,是程序无法控制和处理的,当出现这些异常时,Java虚拟机(JVM)一般会选择终止线程;Exception通常情况下是可以被程序处理的,并且在程序中应该尽可能的去处理这些异常。

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

  • 问题1:不会使用JDB调试Java程序
  • 问题1解决方案:
    Linux Bash下调试代码:在相应文件夹下选择在终端打开——用vim生成HelloJDB.java——直接javac -g -d HelloJDB.java——java HelloJDB
    调试基础——
    方法断点:stop in HelloJDB.main;stop at HelloJDB:12
    行断点:stop in HelloJDB.main-run-locals-step(next)-locals-print i-print j-list
    条件断点:
    临时断点:
    使用:jdb -classpath .:./bin HelloJDB 调试程序;JDB不支持条件断点和临时断点
    实例:类的调试-递归学习
    技术图片

  • 问题2:不会连接数据库
  • 问题2解决方案:(1)数据库连接测试
    技术图片

(2)访问数据库表-封装新增留言信息-测试:
技术图片

[代码托管]

https://gitee.com/EvelynYang/20189230/tree/master/src

statistics.sh脚本运行结果的截图

技术图片

技术图片

技术图片

上周考试错题总结

  • 11.如果有以下程序片段:
    public class Some{
    private Some some;
    private Some(){}
    public static Some create(){
    if(some=null){
    some = new Some():
    }
    return some;
    }
    }
    以下描述正确的是
    A .编译失败
    B .客户端必须new Some()产生Some实例
    C .客户端必须new Some.create()产生Some实例
    D .客户端必须Some.create()产生Some实例
    正确答案: D 我的答案: A
  • 15.如果有以下程序片段:
    public class Some{
    public int x;
    public Some(int x){
    this.x=x;
    }
    }
    以下描述正确的是
    A .new Some(10)创建对象后,对象成员x值为10
    B .new Some(10)创建对象后,对象成员x值为0
    C .Some s = new Some(10)后,可使用s.x取值
    D .编译失败
    正确答案: A 我的答案: D

学习进度条

代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
目标 5000行 30篇 400小时
第一周 200/200 2/2 20/20
第二周 300/500 1/3 18/38
第三周 500/1000 1/4 38/76

参考资料

以上是关于《移动平台开发实践》第三周学习任务的主要内容,如果未能解决你的问题,请参考以下文章

20189208《移动平台开发实践》第10周学习总结

《移动平台开发实践》第7周学习总结

第二周学习任务

20189217 2018-2019-2 《移动平台开发实践》第10周学习总结

20189217 2018-2019-2 《移动平台开发实践》第8周学习总结

20189217 2018-2019-2 《移动平台开发实践》第6周学习总结