20145214 《Java程序设计》第3周学习总结

Posted on 2016-03-19 16:57  20145214张宁  阅读(209)  评论(12编辑  收藏  举报

20145214 《Java程序设计》第3周学习总结

教材学习内容总结

定义类

  • 类是对象的设计图,对象是类的实例。类定义时使用class关键词,建立实例使用new关键词。

  • 程序代码如下。

      class Clothes 
      {
      String color;
      char size;
      }
    
      public class Field
      {
      	public static void main(String[] args)
      	{
      Clothes sun = new Clothes();
      Clothes spring = new 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将参数值指定给参数。定义构造函数代码如下。

      class Clothes2
      {
      String color;
      char size;
      Clothes2(String color, char size)
      {
      this.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);
      }
      } 
    
  • 运行结果如下。

标准类

  • 两个基本标准类:java.util.Scannerjava.math.BigDecimal

  • java.util.ScannernextInt()方法会看标准输入中,有没有输入下一个字符串,有的话会尝试将之剖析为int类型。Scanner对每个基本类型都有对应的方法。java.util.Scanner代码如下。

      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.printf("GUESS A NUMBER:");
      	guess = scanner.nextInt();
      }
      while(guess != number);
      
      System.out.println("YOU ARE RIGHT!");
      
      }
      } 
    
  • 运行结果如下。

  • 使用java.math.BigDecimal可以得到更好的精度。代码如下。

      import java.math.BigDecimal;
    
      public class DecimalDemo
      {
      public static void main(String[] args)
      {
      BigDecimal operand1 = new BigDecimal ("1.0");
      BigDecimal operand2 = new BigDecimal ("0.8");
      BigDecimal result = operand1.subtract(operand2);
      
      System.out.println(result);
      
      }
      } 
    
  • 运行结果如下。

  • 用BigDecimal比较相等时,可以直接利用调用add(),再调用equals()比较两个BigDecimal实质上是否相同。代码如下。

      import java.math.BigDecimal;
    
      public class DecimalDemo2
      {
      public static void main(String[] args)
      {
      BigDecimal o1 = new BigDecimal ("0.1");
      BigDecimal o2 = new BigDecimal ("0.1");
      BigDecimal o3 = new BigDecimal ("0.1");
      BigDecimal result = new BigDecimal("0.3");
      if(o1.add(o2).add(o3).equals(result))
      {
      	System.out.println("=0.3");
      }
      else
      {
      	System.out.println("!=0.3");
      }
      
      
      }
      } 
    
  • 运行结果如下。

打包基本类型

  • 打包器(Long、Integer、Double、Float、Boolean等类)的主要目的是提供对象实例作为“壳”,将基本类型打包在对象之中,就可以将基本类型当作对象操作。代码如下。

      public class IntegerDemo
      {
      public static void main(String[] args)
      {
      int data1 = 10;
      int data2 = 20;
      Integer w1 = new Integer(data1);
      Integer w2 = new Integer(data2);
      System.out.println(data1/3);
      System.out.println(w1.doubleValue()/3);
      System.out.println(w1.compareTo(w2));
      }
      } 
    
  • 运行结果如下。

数组

  • 在Java中要声明数组并初始值。可以用for循环依次取出数组中的值,也可用更方便的增强式for循环。数组的length属性可以取得数组长度。

  • 增强式for循环声明二维数组代码如下。

      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();
      }
      
      }
      } 
    
  • 运行结果如下。

操作数组对象

  • 使用new建立数组后,每个索引元素会有默认值,如果默认值不符合需求,则使用java.util.Arraysfill()方法设定新建数组的元素值。代码如下。

      import java.util.Arrays;
    
      public class score
      {
      public static void main(String[] args)
      {
      	int[] scores = new int[10];
      	for(int score : scores)
      	{
      		System.out.printf("%2d",score);
      	}
      	System.out.println();
      	Arrays.fill(scores,60);
      	for(int score : scores)
      	{
      		System.out.printf("%3d",score);
      	}
      }
      } 
    
  • 运行结果如下。

数组复制

  • 数组复制的基本做法是另行建立新数组。另一种做法是使用arrays.copyOf()方法。

  • System.arraycopy()的五个参数分别是来源数组、来源起始索引、目的数组、目的起始索引、复制长度。

  • arrays.copyOf()数组复制代码如下。

      import java.util.Arrays;
    
      public class Copy
      {
      	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);
      		}
      	}	
      } 
    
  • 运行结果如下。

  • arrays.copyOf()和```System.arraycopy()``用在类类型声明的数组时,都是执行浅层复制。

  • 深层复制代码如下。

      class Clothes2
      {
      String color;
      char size;
      Clothes2(String color, char size)
      {
      	this.color=color;
      	this.size=size;
      }
      }
    
      public class Deep
      {
      public static void main(String[] args)
      {
      		Clothes2[] c1 = {new Clothes2("red",'S'),new Clothes2("green",'M')};
      	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;
      	}
      	c1[0].color = "yellow";
      	System.out.println(c2[0].color);
      }
      } 
    
  • 运行结果如下

字符串

  • 在Java中,字符串是java.lang.String实例,用来打包字符数组。

  • 可以使用length()取得字符串长度,使用charAt()指定取得字符串中某个字符,使用toUppercase()将原本小写的字符串内容转为大写。

  • 让用户输入整数,输入0后会计算所有整数总和并显示,代码如下。

      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("input numbers:");
      	number = Long.parseLong(scanner.nextLine());
      	sum += number;
      }
      while(number != 0);
      System.out.println("sum:"+sum);
      }
      } 
    
  • 运行结果如下。

  • 用 "" 写下的字符串称为字符串常量,使用 + 连接字符串会产生新的String实例。

  • 使用 + 连接字符串,改用StringBuilder来改善的代码如下。

      public class One
      {
      public static void main(String[] args)
      {
      StringBuilder builder = new StringBuilder();
      for(int i = 1; i < 100; i++)
      {
      	builder.append(i).append('+');
      }
      System.out.println(builder.append(100).toString());
      }
      } 
    
  • 运行结果如下。

封装

  • 封装目的主要是隐藏对象细节。
  • 使用private定义私有成员,封装了类私有数据,让用户必须通过你提供的操作方法,经过你定义的流程才有可能存取私有数据。

类语法

  • public为公开类,在构造函数上声明public表示其他包中的类可以直接调用这个构造函数,在方法上声明public表示其他包的方法可以直接调用这个方法。
  • 没有定义任何权限关键字时,就是包权限。
  • 只有编译程序自动加入的构造函数,才成为默认构造函数,如果自行撰写无参数、没有内容的构造函数就不称为默认构造函数了。

重载构造函数

  • 可以定义多个构造函数,只要参数类型或个数不同。

  • 定义方法时也可以进行重载,虽然调用的方法名称相同,但根据传递的自变量类型不同,会调用对应的方法。

  • 方法重载代码如下。

      class Some
      {
      void someMethod(int i)
      	{
      	System.out.println("int is used");
      	}
      void someMethod(Integer integer)
      	{
      	System.out.println("Integer is used");
      	}
      }
      public class Overload
      {
      	public static void main(String[] args)
      	{
      		Some s = new Some();
      		s.someMethod(1);
      	}
      }
    
  • 运行结果如下。

  • 若想让上面的程序结果显示为“Integer被调用”则代码修改如下。

      class Some
      {
      void someMethod(int i)
      {
      	System.out.println("int is used");
      }
      void someMethod(Integer integer)
      {
      	System.out.println("Integer is used");
      }
      }
      public class Overload2
      {
      	public static void main(String[] args)
      	{
      		Some s = new Some();
      		s.someMethod(new Integer(1));
      	}
      }
    
  • 运行结果如下。

this

  • this关键字可以出现在类中任何地方,在构造函数与对象数据成员同名时,可用this加以区别。

  • 代码如下。

      class Other
      {
      System.out.println("dui xiang chu shi qu kuai");
      }
      Other()
      {
      System.out.println("Other() ");
      }
      Other(int o )
      {
      this();
      System.out.println("Other(int o ) ");
      }
      public class ObjectBlock
      {
      public static void main(String[] args)
      {
      	new Other(1);
      }
      }
    

static类成员

  • 被声明为static的成员,不会让个别对象拥有,而是属于类,将类名称作为名称空间。

  • 在static方法或区块中不能出现this关键字。

  • import static语法代码如下。

      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.print("%s 你好!%n",scanner.nextLine());
      }
      }
    

不定长度自变量

  • 使用不定长度自变量时,方法上声明的不定长度参数必须是参数列最后一个。

内部类

  • 在类中再定义类。

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

  • 问题:a.add(b).add(c).equals(result)的写法是固定的么?

  • 解决:尝试了a.add(b).equals(result)a.equals(result)写法,发现程序都能编译成功并且得到正确的结果,深入学习后发现equals()可以自行定义如何比较两对象的内含值并且不同于 == 。操作过程及截图如下。
    尝试的运行结果为

    尝试的运行结果为

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

  • 问题1:在调试使用java.util.Scanner的代码中打印提示语“猜数字”及“猜中了”时出现错误。

  • 解决:将两句话改为英文描述时运行成功了,但是仍然不清楚为什么用中文会运行失败。

  • 问题2:尝试运行书本137面ObjectInitialBlock.java代码时出现错误。

  • 解决:反复对照后没有发现程序输入的错误,但无法解决运行时出现的错误。

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

和第二周相比,第三周的学习量明显增加了,通过第四章和第五章的学习,我对于java中更深层次的概念有了进一步的了解,也记住了很多java语言中的使用规则,虽然还不能自己解决所有的代码调试中出现的问题,但是经过两周的学习,在代码调试出现问题时不会再像最初一样慌张,开始学会冷静下来自己尝试着解决。另外,本周学会了开源中国的代码托管。

学习进度条

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

参考资料

Copyright © 2024 20145214张宁
Powered by .NET 8.0 on Kubernetes