封装的基础实现
在Java中所有面向对象的概念都是以类与对象的关系为主的,那么首先我们通过一个例子解释为什么需要提供封装性
观察如下代码:
class Person{
String name;
int age;
public void tell(){
System.out.println("姓名:"+name+",年龄:"+age);
}
}
public class MyClass {
public static void main(String[] args){
Person person = new Person();
person.name = "张三";
person.age = -30;
person.tell();
}
}
- 运行结果:
姓名:张三,年龄:-30
- 此时的代码没有语法错误,但是从现实的角度来讲,这个代码是有错误的且问题严重(年龄:-30)。这样的错误严格来讲属于业务错误
- 错误原因在于当前类的属性可以直接被类外部的对象调用,所以此时我们认为这样的操作是属于不安全的操作。因此需要解决的问题是将内部的属性保护起来,即:不让外部直接操作,为此在Java中提供了
private
关键字,利用此关键字可以实现封装
封装性代码如下:
class Person{
private String name;
private int age;
public void tell(){
System.out.println("姓名:"+name+",年龄:"+age);
}
}
加入private
之后,就表示此时name和age两个属性只能够被Person类访问
- 现在发现,使用了
private
定义的属性,类的外部不能够直接访问,所以安全性是最高的 - 如果现在需要通过对象操作类中的属性,在Java中就有了一个明确的要求:可以使用
setter
、getter
方法取得封装性内容,以private String name;
为例:
设置数据:public void setName(String n);
取得数据:public String getName();
使得外部可以访问:
class Person{
private String name;
private int age;
public void tell(){
System.out.println("姓名:"+name+",年龄:"+age);
}
public void setName(String n){
name = n;
}
public String getName(){
return name;
}
public void setAge(int n){
if (age >0 && age < 200){
age = n;
}
}
public int getAge(){
return age;
}
}
public class MyClass {
public static void main(String[] args){
Person person = new Person();
person.setName("张三");
person.setAge(30);
person.tell();
}
}
此时经过封装后,外界访问属性需设置符合现实规律的值才可以显示(0<age<200),否则无法得到想要的结果
:只要是类中的属性应使用private
封装,封装后的属性必须严格按照要求编写setter
、getter
方法
总结:
-
private
声明的属性只能够被类的内部所访问 -
private
声明的属性必须有对应的setter
、getter
方法,而且方法名称要求按照严格标准编写