20145110 《Java程序设计》第三周学习总结
教材学习内容总结
chapter4 认识对象
定义类
类定义时要使用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);
}
}
在这个程序中,一共定义了两个类,一个是公开的Main类,所以在文档中,主文档的命名就是Main,而另外一个就是非公开的clothes类。在程序中,又分别建立了两个clothes的实例,并分别声明了sun与spring两个名称来参考。
这里要注意:在Field.java中,存在公开的Field类(即存在public class Field语句),所以文档名称必须是Field。
所以当我将class的名重命名为Clothes时,会出现如下的编译错误
构造函数中,由于参数与数据类型重名,必须用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
1.使用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!");
}
}
2.使用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的方法之一是使用字符串,BigDecimal在创建时会剖析传入的字符串,以默认精度进行接下来的运算。
4.2 基本类型打包器
打包器的基本类型为:Long、Integer、Double、Float、Boolean。将基本类型打包在对象之中,可以将对象当作基本类型来进行操作。
将基本类型打包在对象之中,就可以操作这个对象。
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));
}
}
4.2.2 自动装箱、拆箱
Integer wrapper = 10; //自动装箱
int foo = wrapper; //自动拆箱
wrapper会参考至Integer,若被指定给int型的变量foo,则会自动取得打包的int类型再指定给foo。
4.3 数组对象
声明二维数组来储存XY坐标位置。声明二维数组,在类型关键词旁加上[][]。
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();
}
}
}
或者用更简洁的for循环来改写
for(int[] row:cords) {
for(int value :row) {
System.out.printf("%2d",value);
}
System.out.println();
}
4.3.2 操作数组对象
当实现并不知道元素值,只知道元素个数,可以用new关键词指定长度来建立数组。
例如
int[] scores=new int[10];
可以用java.utill.Arrays的fill()方法来设定新建数组的元素值。
import java.util.Arrays;
public class Score2
{
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);
}
}
}
4.3.3 数组复制
数组复制的基本做法是另行建立新数组。System.arraycopy()的五个参数分别是来源数组、来源起始索引、目的数组、目的起始索引、复制长度。
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);
}
}
}
4.4 字符串对象
字符串本质是打包数组的对象
String name="justin"; //建立String实例
System.out.println(name); //显示justin
System.out.println(name.length()); //显示长度为6
System.out.println(name.charAt(0)); //显示第一个字符j
System.out.println(name.toUpperCase()); //显示JUSTIN
import java.util.Scanner;
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);
}
}
第五章 对象封装
5.1 何谓封装
对象(或者说是类)可以封装变量, 函数及其它对象. 所谓"封装"即调用对象的用户不必了解实现特定功能的详细代码和过程, 只需懂得设置对象属性(即定义时被封装的变量), 调用其方法(即定义时被封装的函数)就可以了。
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);
}
}
}
5.2 类语法细节
public权限修饰
public是个公开类,可以在其他包的类中使用。可以在构造函数上声明public,这表示其他包中的类可以直接调用这个构造函数。可以在方法上声明public,这表示其他包中的方法可以直接调用这个方法。
关于构造函数
public class Some {
private int a=10;
private String text;
public Some(int a, String text) {
this.a=a;
this.text=text;
}
}
重载构造函数
(1)重载的概念:在同一个类中,允许存在一个以上的同名函数,只要他们的参数个数或者参数类型不同即可。
(2)重载的特点:与返回值类型无关,只看参数列表。
(3)重载的好处:方便于阅读,优化了程序设计。
使用this
/**
* Created by TYC on 2016/3/20.
*/
class Other{
{
System.out.println("对象初始区块");
}
Other()
{
System.out.println("Other() 构造函数");
}
Other(int o )
{
this();
System.out.println("Other(int o ) 构造函数");
}
}
public class ObjectInitialBlock
{
public static void main(String[] args)
{
new Other(1);
}
}
static类成员
被声明为static的成员,不会让个别对象拥有,而是属于类。
由于static成员是属于类,而非个别对象,所以在static成员中使用this,会是一种语意上的错误。
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());
}
}
教材学习中的问题和解决过程
这一周的学习较前两周来说,学习量特别大。有很多晦涩难懂的知识点,需要很长时间消化理解。需要多尝试一些代码来加强理解。
代码调试中的问题和解决过程
一个 *.java 文件中,只能有一个public 的类,而且这个public修饰的这类必需要和这个文件名相同
问题出在文件命名上,应该命名为Sum.java
另外,我尝试了书中P121的操作题1,是一个关于费氏数列的问题。其中用到了数组和java.util.Scanner.
代码如下:
import java.util.Scanner;
public class Fei1 {
public static void main(String[] args) {
Scanner s = new Scanner(System.in);
System.out.printf("求几个费氏数?");
int n=s.nextInt();
int arr[] = new int[n];
arr[0] =0;
arr[1] = 1;
for (int i = 2; i < arr.length; i++) {
arr[i] = arr[i - 1] + arr[i - 2]; }
System.out.printf("斐波那契数列的前%d项如下所示:",n);
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]); }
}
}
截图如下所示:
不过所显示的结果是一行一个,看上去并不美观,不知道如何修改。希望老师能够指导。
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 | |
第一周 | 200/200 | 2/2 | 20/20 | |
第二周 | 300/500 | 1/3 | 18/38 | |
第三周 | 500/1000 | 1/4 | 26/60 |