面向对象高级训练
1、试题:
假设用户账号为:admin,密码为 123,编写用户登陆案例。 要求:请将登陆定义为 login 方法, 并将 login 方法写在 UserService 类中。
思路:
1、封装账号密码两个属性
class UserService{
private String account_number;//账号
private String password;//密码
public String getAccount_number() {
return account_number;
}
public void setAccount_number(String account_number) {
this.account_number = account_number;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
2、创建登陆方法
public void login() {//登录方法
Scanner input1 = new Scanner(System.in);//获取账号
System.out.println("请输入账号:");
this.account_number = input1.next();
Scanner input2 = new Scanner(System.in);//获取密码
System.out.println("请输入密码:");
this.password = input2.next();
3、判断是否登录成功
if(this.account_number.equals("admin") && this.password.equals("123")) {//判断账号密码是否正确
System.out.println("登陆成功");
}else {
System.out.println("您输入的密码有误,请重新输入");
login();//输入错误递归直至输入正确
}
2、 试题:
设置一个类, 命名为 MyList
类中包含属性:Object[] element
方法有如下几个:
- 增加方法 add : 可以向数组属性中依次存储 Object,数组内容
存满时,需实现动态扩容(详解在下面)。 - 删除方法 remove :可以根据数据或下标,从数组属性中删除
Object 数据,删除后,数组后续元素需前移。 - 查询方法 get :方法传入下标,返回数组中指定下标的数据。
当前存储数据量 size : 获取当前存储的有效数据长度
动态扩容详解:无需真正增加原数组的容量,只用将原内容复制到新
的大数组,然后让原数组名称重新等于大数组即可。由于原数组数据在堆中,
失去引用会被 GC 自动回收。
思路:
1、add方法
public static int size = 0;
Object[] element = new Object[10];//创建element数组
public void add(Object o){//创建add方法
element[size] = o;//依次存储数据
size++;
if(size >= element.length) {//当超出数组长度进行扩容
int y = size + 5;//每次增加5个长度
Object[] nums = new Object[y];//创建新数组
for(int i = 0;i < size;i++) {
nums[i] = element[i];//将数据给到新数组
}
element = nums;//将新数组更名为element
System.out.println("扩容已完成,当前数据量:" + element.length);
}
}
2、remove方法(下标删除数据)
public static int size = 0;
Object[] element = new Object[10];//创建element数组
public void add(Object o){//创建add方法
element[size] = o;//依次存储数据
size++;
if(size >= element.length) {//当超出数组长度进行扩容
int y = size + 5;//每次增加5个长度
Object[] nums = new Object[y];//创建新数组
for(int i = 0;i < size;i++) {
nums[i] = element[i];//将数据给到新数组
}
element = nums;//将新数组更名为element
System.out.println("扩容已完成,当前数据量:" + element.length);
}
}
3、remove方法(直接输入数据删除)
public void remove2() {
Scanner input = new Scanner(System.in);//获取用户想要删除的数据
System.out.println("请输入你要删除的数据:");
String a = input.next();
int d = 0;//此数据用来判断是否执行了删除操作
for(int b = 0;b < element.length;b++) {//遍历数组找出要删除的数据
if(a.equals(element[b])) {//找到要删除的数据
for(int i = b + 1;i < element.length;i++) {//将后面的数据覆盖要删除的数据
element[b] = element[i];
b++;
}
System.out.println("已删除");
d = 1;//当d==1时说明执行了删除操作
}
}
if(d != 1) {//判断是否执行了删除操作
System.out.println("你输入的数据不在范围内,请重新输入");
remove2();
}
}
4、get方法
public void get(){
Scanner input = new Scanner(System.in);
System.out.println("请输入你要查询的数的下标:");
int n = input.nextInt();
if(n < element.length) {//判断查询的下标是否超出范围
System.out.println("你要查询的数据是:" + element[n]);
}else {
System.out.println("你输入的下标超出范围,请重新输入");
get();//超出范围重新输入
}
}
结论:相较于知识点的记忆,逻辑思路尤为重要。