封装,即隐藏对象的属性和实现细节,仅对外公开接口,控制在程序中属性的读和修改的访问级别。
什么是封装?
这里我们借用《代码大全》中的说法进行理解,《代码大全》中说,软件开发的本质就是对程序复杂程度的管理。如果一个软件代码复杂程度太高,那么就无法继续维护。如何管理复杂程度?
- 封装就是最基本的方法。
- C语言中的函数也可以理解成一种封装,让调用者不必关注实现的细节。
- Java面向对象中的封装也是类似,类的使用者不必过多关注实现的细节,从而降低整体代码的复杂程度。
private实现封装
public和private这两个关键字表示访问权限控制。
- 被public修饰的成员变量或者成员方法,可以直接被类的调用者使用。
- 被private修饰的成员变量或者成员方法,不能被类的调用者使用。
下面来看两个例子:
直接使用public。
public class Test {
public static void main(String[] args) {
Student student = new Student();
System.out.println("name: " + student.name +
", age: " + student.age);
}
}
class Student {
public String name = "sss";
public int age = 24;
}
上述代码虽然也可以,但是类的使用者(main方法)必须了解Student类的内部实现,才能够使用这个类。学习成本较高。
使用private:
public class Test {
public static void main(String[] args) {
Student student = new Student();
student.show();
}
}
class Student {
private String name = "sss";
private int age = 24;
public void show() {
System.out.println("name: " + this.name
+ ", age: " + this.age);
}
}
此时,字段已经使用private来修饰,类的调用者(main方法中)不能直接使用。而需要借助show方法。此时类的使用者就不需要了解Student类的实现细节。
同时如果类的实现者修改了字段的名字,类的调用者不需要做出任何修改(类的调用者根本看不到name,age这样的字段)。
注意:
- private不仅能够修饰字段,也能修饰方法。
- 通常情况下我们会把字段设为private属性,但是方法是否需要设为public,就需要视具体情形而定。一般我们希望一个类只提供“必要”的public方法,而不应该把所有的方法都无脑设为public。
getter和setter方法
当我们使用private修饰字段的时候,就无法直接使用这个字段了,但是如果有些场景需要获取或者修改这个private字段,我们可以通过getter和setter方法来实现。
public class Test {
public static void main(String[] args) {
Student student = new Student();
System.out.println(student.getAge());
student.setAge(18);
student.show();
}
}
class Student {
private String name = "sss";
private int age = 24;
public int getAge() {
return this.age;
}
public void setAge(int age) {
this.age = age;
}
public void show() {
System.out.println("name: " + this.name
+ ", age: " + this.age);
}
}
注意:
- getAge即为getter方法,表示获取这个成员的值;setAge即为setter方法,表示设置这个成员的值。
- getter和setter方法能不提供就不要提供,会破坏封装性。
- IDEA中可以使用alt + insert快速生成getter和setter方法。
通常将类的数据成员称为字段(field),如果该字段同时提供了getter/setter方法,那么也可以称它为属性(property)。