今天跟大家分享一下Java中面向对象的三大特征。
首先,我们要知道Java中面向对象的三大特征都有什么。
面向对象三大特征:
- 封装
- 继承
- 多态
那么我们今天就来说一下什么是封装。
封装是Java面向对象的核心思想,掌握封装对于学习Java面向对象的内容十分重要。
简单来说,封装就是把抽象出的数据[属性]和对数据的操作[方法]封装在一起,数据被保护在内部,程序的其他部分只能通过被授权的操作[方法],才能对数据进行操作。
封装的理解和好处:
- 隐藏实现细节:方法(连接数据库) <–调用(传入参数…)
- 可以对数据进行验证,保证安全合理
Person {name,age}
Persion p = new Person();
p.name = “潘潘”;
p.age = 1200;
封装的实现步骤(三步):
- 将属性进行私有化private[不能直接修改属性,需要提供一个公共的方法]
public calss Test {
public String name; // 公共的属性
private int age; // 私有化的属性
}
这段代码中,将age属性进行私有化,也就是说age只能在本类中访问,不能在其他类中访问。
- 提供一个公共的(public)set方法,用于对属性判断并赋值
public void setAge(int age) {
this.age = age;
}
使用this关键字的目的:
防止成员属性(private修饰的变量)和局部变量(setAge方法中的int age变量)之间发生同名冲突。
- 提供一个公共的(public)get方法,用于获取属性的值
public int getAge() {
return age; // 将age返回
}
下面我们看一个案例:
不能随便查看人的年龄,工资等隐私,并对年龄进行合理的验证。年龄合理就设置,否则给默认年龄,必须在 1 - 120 之间,工资不能直接查看,名字的长度在 2 - 6字符之间。
public class Test {
public static void main(String[] args) {
Person person = new Person();
person.setName("潘潘"); // 通过set方法给name赋值
person.setAge(22);
person.setSalary(30000);
System.out.println(person.info()); // 调用info方法打印信息
System.out.println(person.getSalary()); // 调用getSalary方法将薪水输出
//如果我们自己使用构造器指定属性
Person smith = new Person("smith", 80, 50000);
System.out.println("====smith 的信息======");
System.out.println(smith.info());
}
}
// 创建一个Person类
class Person {
public String name; //名字(属性)公开
private int age; //年龄(属性) 私有化
private double salary; //薪水(属性) 私有化
//无参构造器
public Person() {
}
//有三个属性的构造器
public Person(String name, int age, double salary) {
this.name = name;
this.age = age;
this.salary = salary;
}
// 创建get/set方法
public String getName() { // 获取name的值
return name;
}
public void setName(String name) {
//加入对数据的校验,相当于增加了业务逻辑
if (name.length() >= 2 && name.length() <= 6) {
this.name = name; // 相当于给方法中的name赋值
} else {
System.out.println("名字的长度不对,需要(2-6)个字符,默认名字");
this.name = "无名人";
}
}
public int getAge() {
return age;
}
public void setAge(int age) {
//判断
if (age >= 1 && age <= 120) {//如果是合理范围
this.age = age;
} else {
System.out.println("你设置年龄不对,需要在 (1-120), 给默认年龄 18 ");
this.age = 18;//给一个默认年龄
}
}
public double getSalary() {
//可以这里增加对当前对象的权限判断
return salary;
}
public void setSalary(double salary) {
this.salary = salary;
}
//写一个方法,返回属性信息
public String info() {
return "信息为 name=" + name + " age=" + age + " 薪水=" + salary;
}
}
运行结果: