您的位置:首页 > 编程语言 > Java开发

浅谈java中面向对象思想——封装。

2017-03-17 00:00 393 查看
本人最近在学习java,java本身也是一门面向对象的语言,那么先简单来说说,何为面向对象。
何为面向对象:编程语言分为面向对象,和面向过程,那么何为面向对象呢,我个人的理解就是,你需要什么,就把相对应用来解决问题的类,拿过来用,而不用自己亲历亲为,对同类对象抽象出其共性,形成类。用这个你抽象出来的类,来解决你要解决事儿。
面向对象三大特性,封装、继承、多态。

一.封装

封装从字面上来理解就是包装的意思,专业点就是信息隐藏,是指利用抽象数据类型将数据和基于数据的操作封装在一起,使其构成一个不可分割的独立实体,数据被保护在抽象数据类型的内部,尽可能地隐藏内部的细节,只保留一些对外接口使之与外部发生联系。其他对象只能通过包裹在数据外面的已经授权的操作来与这个封装的对象进行交流和交互。也就是说用户是无法也无需知道对象内部的细节,但可以通过该对象对外的提供的接口来访问该对象。

就封装而言,一个对象它所封装的是自己的属性和方法,所以它是不需要依赖其他对象就可以完成自己的操作。

使用封装有三大好处:

1、良好的封装能够减少耦合。

2、类内部的结构可以自由修改。

3、可以对成员进行更精确的控制。

4、隐藏信息,实现细节。

public class Teacher{

/*
* 对属性的封装
* 一个人的姓名、性别、年龄、学生都是这个老师的私有属性
*/
private String name ;
private String sex ;
private int age ;
private Student stu;

/*
* setter()、getter()是该对象对外开发的接口
*/
public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public String getSex() {
return sex;
}

public void setSex(String sex) {
this.sex = sex;
}

public int getAge() {
return age;
}

public void setAge(int age) {
this.age = age;
}

public int getStu() {
return stu;
}

public void setStu(Student stu) {
this.stu = stu;
}
}

public class Student{
private String name;
private int age;
private String sex;
private Teacher teacher;

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public String getSex() {
return sex;
}

public void setSex(String sex) {
this.sex = sex;
}

public class Wife {
private String name;
private int age;
private String sex;
private Husband husband;

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public String getSex() {
return sex;
}

public void setSex(String sex) {
this.sex = sex;
}

public void setAge(int age) {
this.age = age;
}

public void setHusband(Husband husband) {
this.husband = husband;
}

public Husband getAge() {
return husband;
}

public void setAge(int age) {
this.age = age;
}

public void setTeacher(Teacher teacher) {
this.teacher = teacher;
}

public Husband getTeacher() {
return teacher;
}

}

从上面两个类,我们可以看出,我们将Teacher类和Student类的属性设置为私有,但是设置了相应的get方法供外界访问,当然如果学生闯祸了,他不想让别人知道他的老师是谁,这样我们只需要取消getTeacher方法就好。

所以封装把一个对象的属性私有化,同时提供一些可以被外界访问的属性的方法,如果不想被外界方法,我们大可不必提供方法给外界访问。但是如果一个类没有提供给外界访问的方法,那么这个类也就没有意义了。(都不让用你还封装这个类干嘛=。=)

当然,这样可能还无法知道封装的好处,以及封装的意义,那么我们可以这样。

public class Student{
private String name;
private int age;
private String sex;
private Teacher teacher;
}

public class Test{
public static void main(String[] args) {
Student stu1 = new Student();
stu1.age = 30;
}
}

在上面的代码中,学生类中的age属性是int属性,如果我们想给它改成String属性怎么办呢?如果只在这一个类里面写了还好,要是在几百个类里都有这个属性,那怎么办呢?

这个时候封装的好处就体现出来了,这个时候只要在Student类里,做一点小的修改就可以了。上代码

/*
* 对属性的封装
* 一个人的姓名、性别、年龄、老师都是这个学生的私有属性
*/
private String name ;
private String sex ;
private String age ;    /* 改成 String类型的*/

public String getAge() {
return age;
}

public void setAge(int age) {
//转换即可
this.age = String.valueOf(age);
}

/** 省略其他属性的setter、getter **/

这个时候只要对,Student的set方法进行一个小的修改就可以了。

其他的地方依然那样引用(stu.setAge(22))保持不变。

到了这里我们确实可以看出,封装确实可以使我们容易地修改类的内部实现,而无需修改使用了该类的客户代码

封装的好处:可以对成员变量进行精确的控制。

封装还可以在类的内部对一些属性进行一些严谨的限制操作,比如性别这个属性,我们一般在数据库中用1或0方式来存储,只有男女,如果出现其他的......

public String getSexName() {
if("0".equals(sex)){
sexName = "女";
}
else if("1".equals(sex)){
sexName = "男";
}
else{
sexName = "???";
}
return sexName;
}

同理,名字,年龄,我们都可以做一些类似的操作,或者在set方法里做一些限制,这里就不一一赘述了。

以上纯属个人观点和理解,欢迎补充和指正,谢谢。请各位大大关注后续的一些博客,下一篇《继承》。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Java 封装