目录
封装:
什么时候用封装?
某一堆/某一项功能可能重复使用好几次--封装成一个方法
为什么要用封装?
如果用private定义变量,外部最多只能赋值,但却不能获取。所以用getter,setter方法。
1.代码层面
属性私有化:所有的属性都要使用private封装
提供一个公有的(public)setget方法
getter方法能够按照客户的期望返回格式化的数据
setter方法可以限制和检验setter方法传入的参数是否合法
隐藏对象的内部结构
正确定义一个类:
所有属性私有化
每个属性都有setter,getter方法----------------整合框架,代码更整洁
2.思想层面
用一个Dog类做例子:
通过set方法给变量赋值,通过get获取。
public class Dog {
private int age;
private String color;
public void setAge(int age){
this.age=age;
}
public void setColor(String color){
this.color=color;
}
public int getAge() {
return age;
}
public String getColor() {
return color;
}
}
写个例子:
实现用户的注册和登录!
封装,所有属性一定要私有化,提供公有的set,get方法
1.创建一个User类,username和password
2.Demo类
数据保存在哪?保存在user类型的数组里
思路:
输入账号和密码,然后取数组中的账号和密码进行对比。
User类:
public class User {
private int username;
private int password;
public User(){}
public User(int username, int password) {
this.username = username;
this.password = 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;
}
}
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];
int index = 0;
for (; ; ) {
System.out.println("请选择功能:1、注册 2、登录");
String flag = sc.next();
switch (flag) {
case "1":
c:
for (; ; ) {
System.out.println("请输入账号:");
int username = sc.nextInt();
for (User u : users) {
if (u != null) {
if (username == u.getUsername()) {
System.out.println("账号已被注册");
break c;
}
}
}
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++;
break c;
}
break;
case "2":
System.out.println("请输入账号:");
int xxx = sc.nextInt();
System.out.println("请输入密码:");
int yyy = sc.nextInt();
boolean x = true;
for (User u : users) {
if (u != null) {
if (u.getUsername() == xxx && u.getPassword() == yyy) {
x = false;
break;
}
}
}
System.out.println(x ? "登陆失败":"登录成功");
}
}
}
}
心得体会:
总结:
this代表当前类的对象,代表方法的调用者,通常用在构造器赋值
set方法赋值,当形参名和成员变量的名相同,赋值操作
封装,思想封装,把一堆重复执行的代码封装成方法。把一堆重复执行的方法封装成一个类
封装,代码层次的封装,所有的属性私有化private每个属性提供setter,getter方法
以后我们的赋值操作:
1.不再使用对象,属性的方式
2.使用构造器(过于强势,出来的时候就是带着属性的值)
3.setter方法赋值。
习惯:
保证每个类都有一个无参构造器。