private实现封装处理
面向对象之中有三大特征: 封装,继承,多态。
对于封装是java中最复杂的概念,而本次所讲解的也只不过是封装的几个基本概念而已。
如果要想清楚封装,首先要必须清楚如果没有封装会怎么样?
范例 1: 观察如下一段程序。
class Person{
String name;
int age;
public void info(){
System.out.println("name="+name+",age="+age);
}
}
public class Test{
public static void main(String[] args){
Person per = new Person();
per.name = "张三";
per.age = -200;
per.info();
}
}
此时实际上是不会出现任何的语法错误的。因为从int型的数据保存范围来讲,是允许保存有负数的。但是是不会有一个人的年龄是-200岁。那么也就证明这个时候属于 业务逻辑出错。
此时如果要想回避此类问题,
那么首先要解决的就是如何可以让对象不能直接操作年龄的属性,或者指的是让类的外部如何不能够操作类中的敏感内容。
所以此时解决问题的 核心观念 就在于:如何让内部的操作对外部不可见,此时就可以利用private关键字来实现
范例 2: 利用private实现封装
class Person{
private String name;
private int age;
public void info(){
System.out.println("name="+name+",age="+age);
}
}
public class Test{
public static void main(String[] args){
Person per = new Person();
per.name = "张三";
per.age = -200;
per.info();
}
}
类中的属性和方法都可以用 private 定义,但还是大部分的情况下很少会在方法上使用private。
一旦属性的声明上使用了private定义之后,那么如果其他类直接进行该属性访问的时候就会出现如下的错误提示:
name可以在Person中访问private
per.name = "张三";
age可以在Person中访问private
per.age = -200;
此时使用了private属性声明之后属性安全了,外部无法直接操作了。但是新的问题又来了。
那么如果现在要想进行private私有属性的访问,按照java的设计原则就可以使用 setter,getter方法:
- setter:主要用于进行属性内容的设置
private String name;
setter方法: public void setName(String name)- getter:主要用于属性内容的取得
private String name;
getter方法: public void getName()
范例:扩展Person类
class Person{
private String name;
private int age;
public void setName(String n){
name = n;
}
public void setAge(String 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 Test{
public static void main(String[] args){
Person per = new Person();
per.setName("张三");
per.setAge(-200);
per.info();
}
}
如果说现在非要进行检测,那么可以在setter里面完成。
class Person{
private String name;
private int age;
public void setName(String n){
name = n;
}
public void setAge(int a){
if (age>=0 && age<=250){
age = a;
}else{
age = 0;
}
}
public String getName(){
return name;
}
public int getAge(){
return age;
}
public void info(){
System.out.println("name="+name+",age="+age);
}
}
public class Test{
public static void main(String[] args){
Person per = new Person();
per.setName("张三");
per.setAge(-200);
per.info();
}
}
类的设计原则:
以后在编写类的时候类中的所有属性必须使用private封装。而使用pritae封装的属性如果需要被外部所使用,那么就按照格式定义相应的 setter,getter方法 。
总结
private实现封装的最大特征在于:只允许本类访问,而不允许外部访问
private只是封装的第一步。