一、个人感受
对象:万事万物皆为对象,客观存在的事物即对象。而面向对象就是关注对象的具体信息,面向对象编程好比去饭店吃饭,让老板给你做,面向过程编程就是自己去做。面向对象的底层其实还是面向过程,把面向过程抽象成类,然后封装,方便我们我们使用的就是面向对象了。这个关卡因为是面对对象的基础,主要在于类和对象的创建方面,并没有过多提及面对对象的应用。关卡最后的一组作业也是联系了之前学过的知识。
二、知识点
(1)类:
是对现实生活中一类具有共同属性和行为的事物的抽象确定对象将会拥有的属性和行为,而在类中属性和行为将会通过成员变量和成员方法来体现。
(2)对象的创建和使用:
(3)成员变量和局部变量的区别:
(4)private关键字:
(5)this关键字:
(6)封装:
三、难题
(1)数组和面向对象组合题
定义类Student,包含三个属性:学号number(int),年级state(int),成绩 score(int)。创建20个学生对象,学号为1到20,年级和成绩都由随机数确定。
问题一:打印出3年级(state值为3)的学生信息。
问题二:使用冒泡排序按学生成绩排序,并遍历所有学生信息
提示: 1) 生成随机数:Math.random(),返回值类型double; (Matn为工具类)([0,1})
2) 四舍五入取整:Math.round(double d),返回值类型long
public class XinStudent {
/*定义类Student,包含三个属性:
学号number(int),
年级state(int),
成绩 score(int)。
创建20个学生对象,学号为1到20,年级和成绩都由随机数确定。
问题一:打印出3年级(state值为3)的学生信息。
问题二:使用冒泡排序按学生成绩排序,并遍历所有学生信息
提示:1) 生成随机数:Math.random(),
返回值类型double; (Matn为工具类)([0,1})
2) 四舍五入取整:Math.round(double d),
返回值类型long*/
//编写类的成员变量
int number;
int state;
int score;
//编写一个用于展示学生信息的成员方法
public String info() {
return "学号:" + number + " 年级:" + state + " 成绩:" + score;
}
public static void main(String[] args) {
//定义一个student类型来存储学生信息
XinStudent[] arr = new XinStudent[20];
for (int i = 0; i < arr.length; i++) {
//数组的每一个元素即为一个对象
arr[i] = new XinStudent();
//给每个对象的每个成员变量赋值
arr[i].number = i + 1;
arr[i].state = (int) (Math.random() * (6 - 1 + 1) + 1);
arr[i].score = (int) (Math.random() * (100 - 0 + 1));
}
//定义一个新对象来方便调用方法
XinStudent test = new XinStudent();
System.out.println("---------------------");
//问题一
test.searchState(arr, 3);
System.out.println("---------------------");
//问题二
test.Bubble(arr);
test.print(arr);
}
//遍历并输出数组的方法
public void print(XinStudent[] arr) {
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i].info());
}
}
//查找相关年级的学生并输出的方法
public void searchState(XinStudent[] arr, int state) {
//遍历一遍数组
for (int i = 0; i < arr.length; i++) {
//满足年级条件的调用方法输出
if (arr[i].state == state) {
System.out.println(arr[i].info());
}
}
}
//冒泡排序
public void Bubble(XinStudent[] arr) {
//每次参加排序的元素
for (int i = arr.length - 1; i > 0; i--) {
//每次排序对象的变量和下一个对象比较,对象换位
for (int j = 0; j < i; j++) {
if (arr[j].score > arr[j + 1].score) {
XinStudent t = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = t;
}
}
}
}
(2)这题我做了蛮久的,最后在老师帮助下才理解
class Value {
int i = 15;
}
class Test {
public static void main(String argv[]) {
Test t = new Test();
t.first();
}
public void first() {
int i = 5;
Value v = new Value();
v.i = 25;
second(v, i);//将全局的v的地址值复制,给了局部的v,全局的v地址值不变,在方法结束后,局部的v弹出栈空间
System.out.println(v.i);//输出全局v地址值所对应的堆内存中的值20
}
public void second(Value v, int i) {
i = 0;
v.i = 20;//局部的v改变了值为20
Value val = new Value();
v = val;//局部的v对应的地址值改变了
System.out.print(v.i + " " + i); //15 //0
}
}
(3)写一个模拟账户
①.写一个名为Account的类模拟账户。该类的属性和方法如下图所示。该类包括的属性:账号id,余额balance,年利率annualInterestRate;包含的方法:访问器方法(getter和setter方法),取款方法withdraw(),存款方法deposit()。
提示:在提款方法withdraw中,需要判断用户余额是否能够满足提款数额的要求,如果不能,应给出提示。
②.创建Customer类。
a. 声明三个私有对象属性:firstName、lastName和account。
b. 声明一个公有构造器,这个构造器带有两个代表对象属性的参数(f和l)
c. 声明两个公有存取器来访问该对象属性,方法getFirstName和getLastName返回相应的属性。
d. 声明setAccount 方法来对account属性赋值。
e. 声明getAccount 方法以获取account属性。
③.写一个测试程序。
(1)创建一个Customer ,名字叫 Jane Smith, 他有一个账号为1000,余额为2000元,年利率为 1.23% 的账户。
(2)对Jane Smith操作。存入 100 元,再取出960元。再取出2000元。打印出Jane Smith 的基本信息
效果如图:
成功存入 :100.0
成功取出:960.0
余额不足,取款失败
public class Account1 {//账号类
/*写一个名为Account的类模拟账户。
该类的属性和方法如下图所示。
该类包括的属性:账号id,余额balance,年利率annualInterestRate;
包含的方法:
访问器方法(getter和setter方法),
取款方法withdraw(),
存款方法deposit()。*/
/*提示:在提款方法withdraw中,
需要判断用户余额是否能够满足提款数额的要求,
如果不能,应给出提示。*/
private int id;
private double balance;
private double annualInterestRate;
public Account1() {
}
public Account1(int id, double balance, double annualInterestRate) {
this.id = id;
this.balance = balance;
this.annualInterestRate = annualInterestRate;
}
public int getId() {
return id;
}
public double getBalance() {
return balance;
}
public double getAnnualInterestRate() {
return annualInterestRate;
}
public void setId(int id) {
this.id = id;
}
public void setBalance(double balance) {
this.balance = balance;
}
public void setAnnualInterestRate(double annualInterestRate) {
this.annualInterestRate = annualInterestRate;
}
public void withdraw(double amount) {
if (balance < amount) {
System.out.println("余额不足,取款失败");
} else {
this.balance -= amount;
System.out.println("取款成功 成功取款:" + amount);
System.out.println("余额为:" + balance);
}
}
public void deposit(double amount) {
this.balance += amount;
System.out.println("存款成功 成功存款:" + amount);
System.out.println("余额为:" + balance);
}
/*写一个测试程序。
(1)创建一个Customer ,
名字叫 Jane Smith,
他有一个账号为1000,
余额为2000元,
年利率为 1.23% 的账户。
(2)对Jane Smith操作。
存入 100 元,再取出960元。再取出2000元。
打印出Jane Smith 的基本信息
效果如图:
成功存入 :100.0
成功取出:960.0
余额不足,取款失败*/
public static void main(String[] args) {
Customer1 customer = new Customer1("Jane", "Smith");
Account1 account = new Account1(1000, 2000, 0.0123);
customer.setAccount(account);
customer.getAccount().deposit(100);
customer.getAccount().withdraw(960);
customer.getAccount().withdraw(2000);
System.out.println(customer.getFirstName() + customer.getLastName() + "账户为:" + customer.getAccount().getId());
System.out.println("余额为:" + customer.getAccount().getBalance() + " 利率为:" + customer.getAccount().getAnnualInterestRate());
}
}
class Customer1 {//顾客类
private String firstName;
private String lastName;
private Account1 account;
public Customer1() {
}
public Customer1(String f, String l) {
this.firstName = f;
this.lastName = l;
}
public String getFirstName() {
return firstName;
}
public String getLastName() {
return lastName;
}
public Account1 getAccount() {
return account;
}
public void setAccount(Account1 account) {
this.account = account;
}
}