Java 封装
在面向对象程式设计方法中,封装(英语:Encapsulation)是指一种将抽象性函式接口的实现细节部分包装、隐藏起来的方法。
封装可以被认为是一个保护屏障,防止该类的代码和数据被外部类定义的代码随机访问。
要访问该类的代码和数据,必须通过严格的接口控制。
封装最主要的功能在于我们能修改自己的实现代码,而不用修改那些调用我们代码的程序片段。
适当的封装可以让程式码更容易理解与维护,也加强了程式码的安全性。
实现Java封装的步骤
1. 修改属性的可见性来限制对属性的访问(一般限制为private),例如:
public class Person {
private String name;
private int age;
}
这段代码中,将 name 和 age 属性设置为私有的,只能本类才能访问,其他类都访问不了,如此就对信息进行了隐藏。
2. 对每个值属性提供对外的公共方法访问,也就是创建一对赋取值方法,用于对私有属性的访问,例如:
public class Person{
private String name;
private int age;
public int getAge(){
return age;
}
public String getName(){
return name;
}
public void setAge(int age){
this.age = age;
}
public void setName(String name){
this.name = name;
}
}
采用 this 关键字是为了解决实例变量(private String name)和局部变量(setName(String name)中的name变量)之间发生的同名的冲突。
快速入门案例:
package com.hspedu.encap;
public class Education01 {
public static void main(String[] args) {
Person p = new Person();
p.setName("jack");
p.setAge(30);
p.setSalary(30000);
System.out.println(p.info());
}
}
class Person {
public String name;
private int age;
private double salary;
//可以用快捷键来写set和get方法 Alt + insert
public int getAge() {
return age;
}
public void setAge(int age) {
//判断年龄合法
if(age >= 1 && age <= 120) {
this.age = age;
}
else {
System.out.println("invalid");
this.age = 18;
}
}
public String getName() {
return name;
}
public void setName(String name) {
//加入对数据的检测
if (name.length() >= 2 && name.length() <= 6){
this.name = name;
}
else {
System.out.println("invalid");
this.name = "无名";
}
}
public double getSalary() {
//可以增加权限访问 密码等
return salary;
}
public void setSalary(double salary) {
this.salary = salary;
}
//写一个方法,返回属性信息
public String info(){
return name+age+salary;
}
}
package com.hspedu.encap;
public class Education01 {
public static void main(String[] args) {
Person p = new Person();
p.setName("jack");
p.setAge(30);
p.setSalary(30000);
System.out.println(p.info());
//如果使用构造器指定属性
Person smith = new Person("smith",2000,50000);
System.out.println(smith.info());
}
}
class Person {
public String name;
private int age;
private double salary;
//构造器 Alt + insert
public Person() {
}
public Person(String name, int age, double salary) {
// this.name = name;
// this.age = age;
// this.salary = salary;
//将set方法写在构造期中,这样可以验证数据
setName(name);
setAge(age);
setSalary(salary);
}
//可以用快捷键来写set和get方法 Alt + insert
public int getAge() {
return age;
}
public void setAge(int age) {
//判断年龄合法
if(age >= 1 && age <= 120) {
this.age = age;
}
else {
System.out.println("invalid");
this.age = 18;
}
}
public String getName() {
return name;
}
public void setName(String name) {
//加入对数据的检测
if (name.length() >= 2 && name.length() <= 6){
this.name = name;
}
else {
System.out.println("invalid");
this.name = "无名";
}
}
public double getSalary() {
//可以增加权限访问 密码等
return salary;
}
public void setSalary(double salary) {
this.salary = salary;
}
//写一个方法,返回属性信息
public String info(){
return name+age+salary;
}
}
将set方法写在构造器内才会有验证的效果,直接写构造的话会绕过set方法,不执行set中的检验信息合法。