面向对象的精髓
面向对象的精髓
(一)封装
概念
-
通常情况下可以在测试类给成员变量赋值一些合法但不合理的数值,无论是编译阶段还是运行阶段都不会报错或者给出提示,此时与现实生活不符。
-
为了避免上述错误的发生,需要对成员变量进行密封包装处理,来隐藏成员变量的细节 以及保证成员变量数值的合理性,该机制就叫做 封装
- 封装就是私有化成员变量,提供公有的get、set方法进行访问
- 特征的访问就是通过 get 和 set 开头的方法
实现流程
- 私有化成员变量,使用 private 关键字进行修饰
- private 表示私有的含义,也就是该成员变量只能在当前类的内部使用
- 提供公有的 get 和set 方法,并在方法体中进行合理值的判断
- 使用public关键字修饰 表示公有的含义,也就是该方法可以在任意位置使用
- 在公有的构造方法中调用set方法进行合理值的判断,可选
- 什么修饰符都没有时为默认的访问权限,级别介于 private 和 public 之间
实践出真理
1.Student类的封装与测试
//实现student类的 封装类
public class Student {
//私有化成员变量
private int id;
//提供公有的方法 get set
public int getId() {
return id;
}
public void setId(int id) {
//对变量修改时进行合理值的判断
if (id > 0) {
this.id = id;
} else {
System.out.println("提供的学号不合理");
}
}
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
//无参构造方法
public Student() {
}
//有参构造方法
public Student(int id, String name) {
setId(id);
setName(name);
}
public void show() {
System.out.println("我是:" + getName() + ",\t我的学号是:" + getId());
}
}
//student类的 测试类
public class StudentTest{
public static void main(String[] args){
Student s = new Student();
s.setId(1002);
s.setName("张三");
s.show();
Student s1 = new Student(52, "李四");
s1.setId(-5263); //提供的学号不合理
s1.show();
}
}
运行结果:
2.班级中学生的信息
- 学生的信息有: 学号、姓名
- 分别打印学生的信息
public class StudentMain{
public static void main(String[] args){
System.out.println("请输入班级的学生人数");
Scanner sc = new Scanner(System.in);
int num = sc.nextInt();
Student[] arr = new Student[num];
for (int i = 0; i < num; i++) {
System.out.println("请输入第 " + i + "\t个学生的信息:学号+姓名");
arr[i] = new Student(sc.nextInt(), sc.next());
}
for (int j = 0; j < arr.length; j++) {
arr[j].show();
}
}
}
运行结果:
3.People类的封装与测试
- people的特征:姓名、年龄、国籍,要求提供打印所有特征的方法
//封装People类
public class People {
//姓名
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
//年龄
private int age;
public int getAge() {
return age;
}
public void setAge(int age) {
if (0 < age && 120 > age) {
this.age = age;
} else {
System.out.println("输入的年龄无效");
}
}
//国籍
private String nationality;
public String getNationality