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.Scanner
和java.math.BigDecimal
。 -
java.util.Scanner
的nextInt()
方法会看标准输入中,有没有输入下一个字符串,有的话会尝试将之剖析为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.Arrays
的fill()
方法设定新建数组的元素值。代码如下。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 |