private(私有)实现封装处理
面向对象之中有三大主要特征:封装,继承,多态,对于封装是整个java中最复杂的概念,而此次所讲的内容也不过是封装中的基本概念而已。
要想清楚封装,首先必须清楚如果没有封装会怎样。
范例:观察如下的一个程序
//观察如下程序
class Person{//定义一个类,类名称要求首字母大写
String name;
int age;
public void info() {
System.out.println("name = "+ name + ",age = " + age);
}
}
public class Class5{
public static void main(String args[]) {
//类名称 对象名称 = new 类名称();
Person per1 = new Person();//声明一个新的对象
per1.name = "wangkai";
per1.age = -230;
per1.info();
}
}
这个程序实际上是不会出现任何的语法错误的,因为从int型的数据保存范围来讲,是允许保存有负数的。但是不会有一个人的年龄是-230,那么这个时候也就证明这个时候属于业务逻辑出错。
此时如果要想回避此类问题,那么首先要解决的就是如何可以让对象不能够直接操作年龄的属性,或者说是如何让类的外部不能够操作类中的敏感内容。所以此时解决问题的核心概念就在于:如何让内部的操作对外部不可见,此时就可以使用private关键字来实现。
范例:利用private来实现封装
//用private实现封装
class Person1{//定义一个类,类名称要求首字母大写
private String name = "wangkai";
private int age = 23;
public void info() {
System.out.println("name = "+ name + ",age = " + age);
}
}
public class Class6{
public static void main(String args[]) {
//类名称 对象名称 = new 类名称();
Person1 per1 = new Person1();//声明一个新的对象
per1.info();
}
}
类中的属性和方法上都可以使用private定义,但是大部分情况下很少会在方法上使用private。一旦属性的声明上使用了private定义之后,那么如果其他类直接进行该属性访问的时候就将出现如下的错误提示:
Exception in thread "main" java.lang.Error: Unresolved compilation problems:
The field Person2.name is not visible
The field Person2.age is not visible
此时使用了private声明之后属性安全了,外部无法直接操作了,但是新的问题又来了。那么如果现在要想进行private私有属性的访问,按照java是设计原则就可以使用setter,getter访问:
private String name:public void setName(String n)
private String name: public void getName()
范例:扩展person类中的内容
//setter,getter
class Person8{//定义一个类,类名称要求首字母大写
private String name = "wangkai";
private int age = 23;
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 Class8{
public static void main(String args[]) {
//类名称 对象名称 = new 类名称();
Person8 per1 = new Person8();//声明一个新的对象
per1.setName("wangkai");
per1.setAge(23);
per1.info();
}
}
如果说现在非要进行检测,那么可以在setter里面完成。
范例:setter检测数据
//可以在setter里面检测数据是否符合要求
class Person9{//定义一个类,类名称要求首字母大写
private String name = "wangkai";
private int age = 23;
public void setName(String n) {
name = n;
}
public void setAge(int a) {
if(a > 0 && a < 150) {
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 Class9{
public static void main(String args[]) {
//类名称 对象名称 = new 类名称();
Person9 per1 = new Person9();//声明一个新的对象
per1.setName("wangkai");
per1.setAge(160);
per1.info();
}
}
类的设计原则:
- 以后再编写类的时候类中的属性必须使用private封装。而使用private封装的属性如果需要被外部所使用,那么按照格式定义相应的setter,getter方法。
private实现封装的最大特征在于:只允许本类访问,而不允许外部访问。
private只是封装的第一步。