20145304 Java第三周学习报告

20145304 《Java程序设计》第三周学习总结

教材学习内容总结

1.定义类:

  • 类定义时使用class关键词,建立实例要使用new关键词。
    代码如下:
/*定义类
书上例子
衣服的型号与颜色
 */
 package cc.openhome;
import java.sql.SQLOutput;
class Clothes{//定义类
    String color;
    char size;
}
public class Field {
        public static void main(String[] args) {

        Clothes sun=new Clothes();
        Clothes spring=new Clothes();//建立Clothes实例

        sun.color="red";
        sun.size='S';
        spring.color="green";
        spring.size='M';//为个别对象的数据成员指定值

        System.out.printf("sun (%s,%c)%n",sun.color,sun.size);
        System.out.printf("spring (%s,%c)%n",spring.color,spring.size);

    }

}
  • 结果截图:

  • 构造函数时若要将某参数的值指定给同名参数时,要使用this表示。
    代码如下:


/*构造函数
书上例题
 */
    package cc.openhome;
class Clothes2{
    String color;
    char size;
    Clothes2(String color,char size){
        //定义构造函数
        this.color=color;//color参数的值指定给这个对象的color成员
        this.size=size;
    }
}

public class Field2 {
    public static void main(String[] args) {
        Clothes2 sun=new Clothes2("red",'S');
        Clothes2 spring=new Clothes2("green",'M');

        System.out.printf("sun (%s,%c)%n",sun.color,sun.size);
        System.out.printf("spring (%s,%c)%n",spring.color,spring.size);

    }

}

结果截图:

2.使用标准类:

  • 使用java.util.Scanner,将字符转化为整数。

代码如下:

//使用标准类
    package cc.openhome;
import java.util.Scanner;//我只是想偷个懒

public class Guess {
    public static void main(String[] args) {
        Scanner scanner=new Scanner(System.in);
        int number=(int)(Math.random()*10);
        int guess;

        do {
            System.out.print("猜数字(0~9):");
            guess = scanner.nextInt();//取得下一个整数
        }while(guess!=number);
        System.out.println("猜中了...XD");
    }
}

结果截图:

  • 使用java.math.BigDecimal,得到更好的精确度。
  • BigDecimal提供有plus()substract()multiply()divide()等方法,可以进行加、减、乘、除等运算,这些方法都会返回代表运算结果的BigDecimal

代码如下:


/*
用equals()进行比较
 */
    package cc.openhome;

import java.math.BigDecimal;

public class DecimalDemo {

    public static void main(String[] args) {
        BigDecimal op1=new BigDecimal("0.1");
        BigDecimal op2=new BigDecimal("0.1");
        BigDecimal op3=new BigDecimal("0.1");
        BigDecimal result=new BigDecimal("0.3");
        if(op1.add(op2).add(op3).equals(result)){
            System.out.println("等于0.3");
        }
        else{
            System.out.println("不等于0.3");
        }
    }
}

结果截图:

3.对象指定与相等性:

  • 基本类型:"="是指将值复制给变量,"=="是比较两个变量存储的值是否相同。
  • 类类型:"="是用在指定参考名称参考某个对象,"=="是用在比较两个参考名称是否参考同一对象。

代码如下:

/*

标准类

对象指定与相等性

书上例题

 */
    package cc.openhome;

import java.math.BigDecimal;

public class Compare {

    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));

    }

}

结果截图:

4.基本类型打包:

  • 基本类型打包器主要目的是将基本类型打包在对象之中,就像是将基本类型当作对象操作。
  • 基本类型打包器都是归类于java.lang包中。
  • Integer提供compareTo()方法,可与另一个Integer对象进行比较,如果打包值相同就返回0,小于就返回-1,大于就返回1。
  • 可用Number类来自动装箱。
  • null代表一个特殊对象,任何类声明的参考名称都可以参考至null,表示该名称没有参考至任何对象实体。

代码如下:

//基本类型打包器
 package cc.openhome;

public class IntegerDemo {
    public static void main(String[] args) {
        int data1=10;
        int data2=20;
        Integer wrapper1=new Integer(data1);
        Integer wrapper2=new Integer(data2);
        System.out.println(data1/3);
        System.out.println(wrapper1.doubleValue()/3);
        System.out.println(wrapper1.compareTo(wrapper2));
    }
}

结果截图:

5.数组:

  • 二维不规则数组:

代码如下:

//不规则二维数组

    package cc.openhome;
public class IrregularArray {
    public static void main(String[] args) {
        int[][] arr=new int[2][];//声明arr参考的对象会有两个索引
        arr[0]=new int[]{1,2,3,4,5};//arr[0]是长度为5 的一维数组,想在new数组中一并指定初始值,不必指定数组长度。
        arr[1]=new int[]{1,2,3};//arr[1]是长度为3的一维数组。
        for(int[] row:arr){
            for(int value:row){
                System.out.printf("%2d",value);
            }
            System.out.println();
        }
    }

}

结果截图:

  • 数组复制:System.arraycopy()的五个参数分别是来源数组、来源起始索引、目的数组、目的起始索引、复制长度。Arrays.copyOf()可以建立新数组,第二个参数是指定建立的新数组长度。
  • 无论是System.arraycopy()还是Arrays.copyOf(),在用类类型声明数组时,都是执行浅层复制。

代码如下:

//数组复制
    package cc.openhome;
import java.util.Arrays;

public class CopyArray {
    public static void main(String[] args) {
        int[] scores1={88,81,74,68,78,76,77,85,95,93};
        int[] scores2=Arrays.copyOf(scores1,scores1.length);
        for(int score:scores2){
            System.out.printf("%3d",score);
        }
        System.out.println();
        scores2[0]=99;//为什么不影响啊??哦
        for(int score:scores1){
            System.out.printf("%3d",score);
        }
        System.out.println();
        for(int score:scores2){
            System.out.printf("%3d",score);
        }
    }
}

结果截图:

6.字符串对象:

  • length()取得字符串长度,使用charAt()指定取得字符串中某个字符,索引从0开始,使用toUpperCase将原本小写的字符串内容转为大写的字符串内容。
  • Java中也可+运算来连接字符串。
  • ""包括的字符串,只要内容相同(序列、大小写相同),无论在程序代码中出现几次,JVM都只会建立一个String实例,并在字符串池中维护。
  • ""写下的字符串称为字符串常量。

代码如下:

//字符串
    package cc.openhome;

import java.util.Scanner;
public class Sum {
    public static void main(String[] args) {
        Scanner scanner=new Scanner(System.in);
        long sum=0;
        long number=0;
        do{
            System.out.print("输入数字:");
            number=Long.parseLong(scanner.nextLine());
            sum+=number;
        }while(number!=0);
        System.out.println("总和:"+sum);
    }
}

结果截图:

7.封装:

  • 在类中定义方法,如果不用返回值,方法名称前可以声明void,方法若有返回值,必须在方法前声明返回值类型。

  • 函数与this应用:

代码如下:

//封装对象初始流程
    package cc.openhome;
class CashCard{
    String number;
    int balance;
    int bonus;
    CashCard(String number,int balance,int bonus){
        this.number=number;
        this.balance=balance;
        this.bonus=bonus;
    }
}
public class CardApp {
    public static void main(String[] args) {
        CashCard[] cards={
                new CashCard("A001",500,0),
                new CashCard("A002",300,0),
                new CashCard("A003",1000,1),
                new CashCard("A004",2000,2),
                new CashCard("A005",3000,3)

        };
        for(CashCard card:cards){
            System.out.printf("(%s,%d,%d)%n",card.number,card.balance,card.bonus);
        }
    }
}

结果截图:

  • 没有定义任何权限关键字时,就是包权限。
  • 在Java中有private、protected与public三个权限修饰。
  • 构造函数与类名称同名,无须声明返回类型的方法。
  • 如果定义类时,没有撰写任何构造函数,编译程序会自动加入一个无参数、内容为空的构造函数。
  • 可以定义多个构造函数,只要参数类型或个数不同,这称为重载构造函数。
  • 封装的目的是主要是隐藏对象细节,不让用户私自篡改。Java中可用private封装对象私有数据成员。

代码如下:

package cc.openhome;
class CashCard{
    String number;
    int balance;
    int bonus;
    CashCard(String number,int balance,int bonus){
        this.number=number;
        this.balance=balance;
        this.bonus=bonus;
    }
}
public class Card {
    public static void main(String[] args) {
        CashCard[] cards={
                new CashCard("A001",500,0),
                new CashCard("A002",300,0),
                new CashCard("A003",1000,1),
                new CashCard("A004",2000,2),
                new CashCard("A005",3000,3)

        };
        for(CashCard card:cards){
            System.out.printf("(%s,%d,%d)%n",card.number,card.balance,card.bonus);
        }
    }
}

结果截图:

8.static类:

  • 被声明为static的成员,不会让个别对象拥有,而是属于类。
  • 被声明为static的方法,也是将类名称作为名称空间,可以通过类名称和"."运算符来调用static。

代码如下:

//static应用
    package cc.openhome;
import java.util.Scanner;
import static java.lang.System.in;
import static java.lang.System.out;

public class ImportStatic {
    public static void main(String[] args) {
        Scanner scanner=new Scanner(in);
        out.print("请输入姓名:");
        out.printf("%s 你好! %n",scanner.nextLine());
    }
}

结果截图:

9.不定长度自变量、内部类与传值调用:

  • 类中定义类,称为内部类。可以定义在类区块中。
  • 要使用不定长度自变量,声明参数列时要在类型关键字后加上...,方法上声明的不定长度参数必须是参数列最后一个。
  • Java中只有传值调用。

代码如下:

  package cc.openhome;
public class CallByValue {
    public static void main(String[] args) {
        Customer c1=new Customer("Justin");
        some(c1);
        System.out.println(c1.name);
        Customer c2=new Customer("Justin");
        other(c2);
        System.out.println(c2.name);
    }
    static void some(Customer c){
        c.name="John";
    }
    static  void other(Customer c){
        c=new Customer("Bill");
    }
}
class Customer{
    String name;
    Customer(String name){
        this.name=name;
    }
}

结果截图:

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

  • 在学习标准类时,不理解书上列举的标准类是什么类。
    解决过程:学习查询Java API文件,上百度搜索。
  • 在学习P105页的代码时,对于代码中不影响score1的参考数组对象不太理解。
    解决办法:改写了程序,将所有数据输出,对比差距。
  • 不太理解书上P129页的代码。
    解决过程:将代码敲了一遍,但运行不出来,觉得少了public,仔细阅读教材,发现其只是修改了一个函数,放入原程序后,得出结果。

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

  • 在使用标准类java.math.BigDecimal时,代码完成后,出现如图错误。

解决过程:仔细查看代码,发现使用equals()时,少写了s。

  • 使用标准类java.util.Scanner时,调试书上代码,代码无错误,但无法显示结果,如图:

解决过程:需要自行输入数字。

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

这周几乎将书上四五章的代码敲了一遍,解决了一些调试中出现的错误,大都是单词漏打了一个字母,或是理解错误,没有调试出结果。今后在写代码是要细心,尽量少出现此类错误。
对IDEA的使用也更加熟练,能掌握一些常用的简略写法,再用Tab键使其显示全部,节约了大量时间。

学习进度条

代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
目标 5000行 15篇 400小时
第一周 30/30 1/2 20/20
第二周 50/80 1/3 10/30
第三周 130/210 1/4 30/60
第四周 0/0 0/0 0/0

代码托管图:

参考资料

posted @ 2016-03-20 10:47  20145304刘钦令  阅读(217)  评论(6编辑  收藏  举报