转自:https://blog.csdn.net/mrbacker/article/details/79715859
面向对象之中有三大主要特征:封装、继承、多态,对于封装是Java中最复杂的概念,本次所写的只不过是几个基本概念而已。
如果是想清楚封装,首先必须清楚如果没有封装会怎么样。
范例: 观察如下一段程序
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 = "Mo Jiu";
per.age = -20;
per.info();
}
}
此时不会出现任何的语法错误,因为从int型的数据范围来讲,是允许保存有负数的,但是不会有一个人的年龄是-20,那么也就证明这个时候属于业务逻辑出错。
此时如果要想回避此类问题,那么首先要解决的就是如何可以让对象不能够直接操作年龄的属性,或者指的是让类的外部如何不能操作类中的敏感内容。所以此时解决问题的核心观念就在于:如何让内部的操作让外部不可见,此时就可以利用private关键字来实现。
范例: 利用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 = "Mo Jiu";
per.age = -20;
per.info();
}
}
类中的属性和方法都可以使用private定义,但是大部分的情况下很少会在方法上使用private。一旦属性的声明使用了private定义之后,那么如果其它类再直接进行该属性访问的时候就将出现如下的错误提示:
TestDemo.java:13: 错误: name可以在Person中访问private
per.name = “Mo Jiu”;
^
TestDemo.java:14: 错误: age可以在Person中访问private
per.age = -20;
此时使用了private声明之后属性安全了,外部无法直接操作了,但是新的问题又来了。那么如果现在要想进行private私有属性的访问,按照Java的设计原则就可以使用setter、getter方法。
setter方法:主要用于进行属性内容的设置
private String name:public void setName(String n)
getter方法:主要用于属性内容的取得
private String name:public String getName()
范例: 扩展Person类中的内容
class Person {
private String name;
private int age; // age与name进行私有 每个成员变量有个get与set两个函数
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("Mo Jiu");
per.setAge(-20);
per.info();
}
}
如果说现在非要进行检测,那么可以再setter里面完成。
class Person {
private String name;
private int age;
public void setName(String n) {
name = n;
}
public boolean setAge(int a) {
return 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("Mo Jiu");
per.setAge(-20);
per.info();
}
}
类的设计原则:
以后在编写类的时候类中的所有属性必须使用private封装。而使用private封装的属性如果需要被外部所使用,那么就按照格式定义相应的 setter、getter 方法。
private 实现封装的最大特征在于:只允许本类访问。
private 只是封装的第一步。