学习目标:
理解今天的学习内容,多加练习,并熟练掌握。
学习内容:
1.this关键字
2.思想封装与代码层面的封装
学习时间:
2022年7月19日
学习产出:
- 技术笔记
- CSDN 技术博客 1 篇
this关键字
1.this代表的是当前类的对象,this代表的是当前方法的调用者,通常在构造器里赋值 2.this既然是代表方法的调用者,它实际上和对象的作用是一样的 既可以调属性,也可以调方法。 3.this不能用在static方法中。 4.this通常用于赋值,在构造器里赋值 this调用构造器的要求 1、必须在构造器中使用this调用构造器 2、必须是第一句话(第一行代码) set方法赋值。当形参名和成员变量的名相同时,赋值操作。一个类里可以有属性,方法,构造器。
调用构造器,不需要写任何的名字 当使用对象调用属性时,调用的是成员变量创建对象时调用构造器
每一个对象都是隔开的
输出结果不会是haha。
输出结果为haha。
练习
有一个Person类,有name,age属性 有一个Debit类,有cardId,password,balance(余额)属性 Person类有一个开户的方法,openAccount,in(余额增加),out(余额减少,取款时要判断余额) Debit类中有一个显示银行卡信息的方法。 赋值的方式: 1.构造器(建议) 2.直接通过.属性的方式赋值 分析: 开户:给Person类的Debit属性赋值,Debit初始化时需要给cardId,password,balance赋值 思考人和卡是什么关系(卡一旦开户就只属于我自己) 最终在Demo类中测试相关功能 加功能:键盘输入,存款和取款需要比对密码。 加键盘输入: 哪些地方是需要我们来输入的? 1.密码,余额 2.存多少钱 3.取多少钱 在哪里写键盘输入Scanner写在哪里? Scanner应该出现在main里建三个类,Demo类,Debit类,Person类 Demo02类
Demo类
public class Demo { public static void main(String[] args) { Person person = new Person("张三",25); Debit debit = new Debit("665544998877",123456,100); person.openAccount(debit); person.in(151); person.out(200); person.out(100); } }
Person类
public class Person { String name; int age; Debit debit; public Person() { } public Person(String name, int age) { this.name = name; this.age = age; } public void openAccount(Debit debit) { this.debit = debit; // 开户成功,显示一下开户信息 debit.show(); show(); } public void in(double money) { // 存款:修改余额并且重新赋值 debit.balance += money; System.out.println("存款成功!余额为:" + debit.balance); } public void out(double money) { // 取款:修改余额并且重新赋值 if(money <= debit.balance){ debit.balance -= money; System.out.println("取款成功!余额为:" + debit.balance); }else { System.out.println("余额不足!余额为:" + debit.balance); } } public void show() { System.out.println("姓名:" + name + ",年龄:" + age); } public boolean valid(int pass){ if(pass == debit.password){ return true; } return false; } }
Debit类
public class Debit { String cardId; int password; double balance; public Debit(){} public Debit(String cardId, int password, double balance) { this.cardId = cardId; this.password = password; this.balance = balance; } public void show() { System.out.println("卡号:" + cardId + ",余额:" + balance); } // public void valid(int pass){ // // } }
Demo02类
public class Demo02 { public static void main(String[] args) { Scanner sc = new Scanner(System.in); Person person = new Person("张三",25); for(;;){ System.out.println("请选择功能:1.开户 2.存款 3.取款"); String flag = sc.next(); switch (flag) { case "1": System.out.println("请输入账户密码:"); int password = sc.nextInt(); System.out.println("请输入余额:"); double balance = sc.nextDouble(); Debit debit = new Debit("654987",password,balance); person.openAccount(debit); break; case "2": System.out.println("请输入密码:"); int pass = sc.nextInt(); // 接下来要去比对密码。 // 存款的时候需要比对密码 // 取款也需要比对密码 // 既然两个地方都需要比对密码,那我们可以把类似功能的代码封装成一个方法 // 如果说一堆的方法都需要重复使用,我们还可以把一堆的方法封装成一个类 boolean b = person.valid(pass); if(b){ System.out.println("请输入存款金额:"); double money = sc.nextDouble(); person.in(money); } else { System.out.println("密码有误,无法存款!"); } break; case "3": System.out.println("请输入密码:"); int pass1 = sc.nextInt(); boolean b1 = person.valid(pass1); if(b1){ System.out.println("请输入取款金额:"); double money = sc.nextDouble(); person.out(money); } else { System.out.println("密码有误,无法取款!"); } break; } } } }
面向对象的特征:封装
1.代码层面 (1)属性私有化,所有的属性都要使用private封装 (2)提供一个公有的set,get方法。 getter方法能够按照客户的期望返回格式化的数据 setter方法可以限制和检验setter方法传入的参数是否合法 隐藏对象的内部结构 正确定义一个类: (1)所有的属性私有化 (2)每个属性都有对应的setter、getter方法 这是规矩,你得遵守。 2.思想层面
练习
注册和登录!
封装:属性一定要私有化,提供公有的set、get方法
1、创建一个User类,username和password
2、创建一个Employee类,id和name
3、Demo类。 * * 登录: * 输入账号和密码,然后去数组中比对,
遍历数组,分别比对账号和面,如果比对成功,则输出登录成功,则输入账号或密码误!
空指针异常NullPointerException
注册2.0版本: 用户名不能重复!
遍历,用户名和数组中的用户名比对一下
建三个类 Demo类 Employee类 User类
Demo类
public class Demo {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
// User类型的数组
// User类型的数中保存的就是一个一个的User对象
// 当从User类型的数组中取值的时候,比如说users[0]是一个User类型的对象
User [] users = new User[10];
users[0] = new User(123456,123456);
int index = 1;
main:for (;;){
System.out.println("请选择功能:1、注册 2、登录");
String flag = sc.next();
u:for(;;){
switch (flag) {
case "1":
System.out.println("请输入账号:");
int username = sc.nextInt();
for (User user : users) {
if(user != null){
if(username == user.getUsername()){
System.out.println("用户名不能重复,请重新输入!");
continue u;
}
}
}
System.out.println("请输入密码:");
int password = sc.nextInt();
// 保存账号密码,保存的是User对象
// 构建User对象
User user = new User(username,password);
users[index] = user;
System.out.println("注册成功,账号:" + users[index].getUsername() + ",密码:" + users[index].getPassword());
index ++;
continue main;
case "2":
System.out.println("请输入账号:");
int username1 = sc.nextInt();
System.out.println("请输入密码:");
int password1 = sc.nextInt();
boolean b = false;
for (User u : users) {
if(u != null){
if(u.getUsername() == username1 && u.getPassword() == password1) {
b = true;
break;
// System.out.println("登录成功!");
}
// System.out.println("账号或密码错误!")
}
}
if(b) {
System.out.println("登录成功!");
}else {
System.out.println("账号或密码错误!");
}
}
}
}
}
}
Employee类
public class Employee {
private int id;
private String name;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
User类
public class User {
private int username;
private int password;
public int getUsername() {
return username;
}
public void setUsername(int username) {
this.username = username;
}
public int getPassword() {
return password;
}
public void setPassword(int password) {
this.password = password;
}
public User() {
}
public User(int username, int password) {
this.username = username;
this.password = password;
}
}