封装是针对类里的属性和方法而言的,目的是为了提高程序的稳健型和安全性,将属性或者方法进行封装起来不被外部直接访问的特性叫做封装。例如:
//创建一个学生类
public class Student {
String stuNo;
String stuName;
int age;
}
//创建测试类
public class Test {
public static void main(String[] args) {
Student student = new Student();
student.stuName = "tom";
student.stuNo = "001";
student.age = 20;
}
}
以上代码没有问题,可以正常使用
public class Test {
public static void main(String[] args) {
Student student = new Student();
student.stuName = "tom";
student.stuNo = "001";
student.age = -20;
}
}
这样写的话也能正常输出,很明显我们的年龄是不能为负数的,因此外部类可以任意的访问一个类的属性,对程序的稳健型来说是不可取的,这样会破坏已有的安全性,为此采用封装。
封装采用访问修饰符:private修饰所要访问的属性或者方法。
public class Student {
private String stuNo;
private String stuName;
private int age;
}
public class Test {
public static void main(String[] args) {
Student student = new Student();
//编译报错
student.stuName = "tom";
//编译报错
student.stuNo = "001";
//编译报错
student.age = -20;
}
}
类中属性不能被直接访问,因此提供get和set方法用于对属性进行赋值和访问获取。
public class Student {
private String stuNo;
private String stuName;
private int age;
public String getStuNo() {
return stuNo;
}
public void setStuNo(String stuNo) {
this.stuNo = stuNo;
}
public String getStuName() {
return stuName;
}
public void setStuName(String stuName) {
this.stuName = stuName;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
//创建测试类
public class Test {
public static void main(String[] args) {
Student student = new Student();
student.setStuName("tom");
student.setStuNo("001");
student.setAge(20);
System.out.println(student.getStuNo() + "," + student.getStuName() + "," + student.getAge());
}
}
//输出结果:
001,tom,20
如果对方法进行封装,而外部需要调用应该怎么办?
public class Demo {
private int getMax(int num1, int num2){
return num1 > num2 ? num1 : num2;
}
}
如上所述,如需调用getMax()方法该怎么办呢?很明显仅仅实例化Demo后还是不行,因为由于private关键字修饰,所以不可以直接进行调用,那么应该怎么处理呢?
public class Demo {
private int getMax(int num1, int num2){
return num1 > num2 ? num1 : num2;
}
//添加一个方法用以调用这个私有方法即可
public int callGetMax(int num1, int num2){
return getMax(num1, num2);
}
}
我们只需要添加一个方法即可,切忌随便修改private关键字为public,因为我们对别人的逻辑和处理方式不太明白,因此需要调用别人的方法只能自己去写一个了。