Java面向对象三大特征之一 封装
Java语言作为一门面向对象的语言,具有三大特性!
文章只讲封装
封装是通过访问修饰符private来实现的
封装的思想是将类中的成员变量或者成员方法私有化!让这些属性和方法只能在类中访问!如果想在类外访问的话,只能使用类对外提供的公共访问方法!
要理解封装,首先要知道没有封装会怎么样!
观察代码:
class Person {
String name; //名字
int age; //年龄
public void info() {
System.out.println("name = " + name + "、age = " + age);
}
}
public class TestDemo {
public static void main(String[] args) {
Person per = new Person();
per.name = "jack";
per.age = -20;
per.info();
}
}
这样写是没有任何问题的,但是在现实中,这样的数据就是错误的,没有人的年龄是-20;这是对对象属性直接操作的结果!
此时如果要想回避此类问题,那么首先要解决的就是如何可以让对象不能够直接操作年龄的属性,或者指的是让类的外部如何不能操作类中的敏感内容。所以此时解决问题的核心观念就在于:如何让内部的操作让外部不可见,此时就可以利用private关键字来实现。
class Person {
private String name;
private int age;
public void info() {
System.out.println("name = " + name + "、age = " + age);
}
}
public class TestDemo {
public static void main(String[] args) {
Person per = new Person(); //实例化对象
per.name = "jack";
per.age = -20;
per.info();
}
}
一旦属性的声明使用了private定义之后,那么如果其它类再直接进行该属性访问的时候就将出现如下的错误提示:
TestDemo.java:13: 错误: name可以在Person中访问private
per.name = “jack”;
^
TestDemo.java:14: 错误: age可以在Person中访问private
per.age = -20
这时候就对外提供了公共访问方法来进行值的修改和读取:getter()&setter()
class Person {
private String name;
private int age;
public void setName(String n) {
name = n;
}
public void setAge(int a) {
age = a;
}
public String getName() {
return name;
}
public int getAge(){
return age;
}
public void info() {
System.out.println("name = " + name + "、age = " + age);
}
}
public class TestDemo {
public static void main(String[] args) {
Person per = new Person(); //实例化对象
per.setName("jack");
per.setAge(-20);
per.info();
}
}
实现对数据的过滤功能在set中加入过滤就行!
class Person {
private String name;
private int age;
public void setName(String n) {
name = n;
}
public void setAge(int a) {
if(a >= 0 && a <= 150)
age = a;
age = 0;
}
public String getName() {
return name;
}
public int getAge(){
return age;
}
public void info() {
System.out.println("name = " + name + "、age = " + age);
}
}
public class TestDemo {
public static void main(String[] args) {
Person per = new Person();
per.setName("jack");
per.setAge(-20);
per.info();
}
}
private的最大特点就是只允许本类访问!