本人也是刚刚入职java开发的小白,在实际工作中和在学校用到的东西还是有很多不一样的,虽然我是科班出身,但是还是深感自己基础不牢啊,可谓基础不牢,地动山摇,在工作中往往一个简单的bug找到吐血,还是对语言的理解不深,所以决定把自己的基础重新补一补。
今天来说一说java 最典型的三大特性,封装,继承和多态。
封装:个人的理解是就是把一个对象的所有属性都放在一个封装类A里面,在使用这个对象的属性时,通过调用封装类A的get和set方法对属性进行操作。
他们解释:封装从字面上来理解就是包装的意思,专业点就是信息隐藏,是指利用抽象数据类型将数据和基于数据的操作封装在一起,使其构成一个不可分割的独立实体,数据被保护在抽象数据类型的内部,尽可能地隐藏内部的细节,只保留一些对外接口使之与外部发生联系。系统的其他对象只能通过包裹在数据外面的已经授权的操作来与这个封装的对象进行交流和交互。也就是说用户是无需知道对象内部的细节(当然也无从知道),但可以通过该对象对外的提供的接口来访问该对象。
对于封装而言,一个对象它所封装的是自己的属性和方法,所以它是不需要依赖其他对象就可以完成自己的操作。
使用封装有三大好处:
- 良好的封装能够减少耦合。
- 类内部的结构可以自由修改。
- 可以对成员进行更精确的控制。
- 隐藏信息,
接下来看一下例子,PersonPO.java, ParentsPO.java
package com.po;
public class PersonPO {
/**
* 姓名
*/
private String name;
/**
* 性别
*/
private String sex;
/**
* 年龄
*/
private int age;
/**
* 父母
*/
private ParentsPO parentsPO;
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 ParentsPO getParentsPO() {
return parentsPO;
}
public void setParentsPO(ParentsPO parentsPO) {
this.parentsPO = parentsPO;
}
}
上面是personPO.java 类,用来封装好了人这个对象的一些属性,这里顺带提一下,在公中代码的编写习惯很重要,做好做到规范,一般在封装类中的属性都要写注释并且使用/**注释*/这种,只有在方法体中的注释才是 //注释。关于java编写规范的问题我自己还没有整理,不过网上就有很多,自己多注意一下吧,下面这个这个链接就是java规范的问题:http://www.cnblogs.com/foreverly/articles/6581198.html
package com.po;
public class ParentsPO {
private String name;
private String age;
private String idCard;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public void setAge(String age) {
this.age = age;
}
public String getIdCard() {
return idCard;
}
public void setIdCard(String idCard) {
this.idCard = idCard;
}
}
可以看到在parentsPO.java中没有getage()方法,所以外界便不能获得parentsPO对象的age的属性值了
所以封装把一个对象的属性私有化,同时提供一些可以被外界访问的属性的方法,如果不想被外界方法,我们大可不必提供方法给外界访问。但是如果一个类没有提供给外界访问的方法,那么这个类也没有什么意义了。比如我们将一个房子看做是一个对象,里面的漂亮的装饰,如沙发、电视剧、空调、茶桌等等都是该房子的私有属性,但是如果我们没有那些墙遮挡,是不是别人就会一览无余呢?没有一点儿隐私!就是存在那个遮挡的墙,我们既能够有自己的隐私而且我们可以随意的更改里面的摆设而不会影响到其他的。但是如果没有门窗,一个包裹的严严实实的黑盒子,又有什么存在的意义呢?所以通过门窗别人也能够看到里面的风景。所以说门窗就是房子对象留给外界访问的接口。
接下来说再来看,如果有一天想要把PersonPO.java中的age属性类型该成string类型,如果是小项目或是开发刚刚起步还好,但如果是一个大的系统,很多地方都用到了这个对象,你现在改一下这个对象的属性类型,那么就有成千上万个地方等着你改。所以这个时候你着用改一下set 方法
package com.po;
public class PersonPO {
/**
* 姓名
*/
private String name;
/**
* 性别
*/
private String sex;
/**
* 年龄改成String类型
*/
private String age;
/**
* 父母
*/
private ParentsPO parentsPO;
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 String getAge() {
return age;
}
public void setAge(int age) {
if(age > 120){
System.out.println("ERROR:error age input....");
//提示錯誤信息
}else{
this.age = String.valueOf(age);
}
}
public ParentsPO getParentsPO() {
return parentsPO;
}
public void setParentsPO(ParentsPO parentsPO) {
this.parentsPO = parentsPO;
}
}
通过上面的例子,我想说的是,其实在封装类中的get和set 方法是可以操作的,因为我们往往在编写项目的过程中,在创建对象类的时候,只是把对象类的属性写好,然后依靠编译器自动生成get 和set方法,从而忽略有些时候修改get和set 方法能更轻松的解决问题。