《JavaOOP》第二篇--封装
JavaOOP之封装
目录
封装
封装(Encapsulation)是面向对象的三大特征之一,是指将抽象性函式接口的实现细节部分包装、隐藏起来的方法。就是将类的状态信息隐藏在类的内部,不允许外部程序直接访问,而通过该类提供的方法来实现对隐藏信息的操作和访问。
可以认为是一种保护屏障,防止该类的代码和数据被外部类定义的代码随机访问。要访问该类的代码和数据,必须通过严格的接口控制。
封装的特点
封装最的主要功能在于我们能修改自己的实现代码,而不用修改那些调用我们代码的程序片段。适当的封装可以让程式码(程序源代码,“程式码”是*叫法)代码更容易理解和维护,也加强了程式码的安全性。
封装的优点:
- 良好的封装能够减少耦合
- 类内部的结构可以*修改
- 可以对成员变量更精确的控制
- 隐藏信息,实现细节
总的来说就是:隐藏类的实现细节,让使用者只通过程序规定的方法来访问数据,可以方便加入存取控制语句,限制不合理操作。
代码耦合:一个软件结构内不同模块之间互连程度的度数(耦合性也叫块间联系)。模块之间联系越紧密,其耦合性就越强,模块的独立性就越差,模块间耦合的高低取决于模块间接口的复杂性,调用的方式以及传递的信息。
软件工程规定写代码的原则是“高内聚,低耦合”。内聚是代码块间的独立性,耦合是各个代码块间的联系。
具体步骤
修改属性的可见性来限制对属性的访问,为每个属性创建一对赋值(setter)方法和取值(getter)方法,用于对这些属性的存取。
在赋值方法中,加入对属性的存取控制语句。
封装时会用到多个权限控制符来修饰成员变量和方法如下:
- private:成员变量和方法只能在其定义的类中被访问,具有类可见性。
- 默认:成员变量和方法只能被同一个包里的类访问,具有包可见性。
- protected:可以被同一个包中的类访问,被同一个项目中不同包中的子类访问(父类、子类的概念在继承中会讲到)。
- public:可以被同一个项目中的所有类访问,具有项目可见性,这是最大的访问权限。
实际开发中封装那些属性、如何封装取决于业务需求。
代码块
我们之前提到过被“{”和“}”包裹的代码会被称为代码块,但是代码块也分为很多种:
- 普通代码块:方法内的代码,每个方法都有一对大括号。
- 构造代码块:类内的代码块,就是在类中什么也不写只写一对大括号。
- 静态代码块:构造代码块钱前“static”关键字。
无论产生多少实例对象,静态代码块只执行一次。而构造代码块是随着实例化的过程调用的。普通代码块是随着方法调用执行的。
代码块优先级:
静态代码块>构造代码块>普通代码块
封装Demo(举例定义一个猫类):
public class Cat {
private String nameString = "无名氏";// 名称
private int month = 1;// 年龄
private String colorString = "黑色";// 颜色
private char sex_male = '公';// 性别
private int health = 100;// 健康值
/**
* 有参构造方法
*
* @param nameString
* @param month
* @param colorString
* @param sex_male
* @param health
*/
public Cat(String nameString, int month, String colorString, char sex_male, int health) {
super();
this.nameString = nameString;
this.month = month;
this.colorString = colorString;
this.sex_male = sex_male;
this.health = health;
}
/**
* 无参构造方法
*/
public Cat() {
}
/**
* 测试方法
*/
@Override
public String toString() {
return "Cat [nameString=" + nameString + ", month=" + month + ", colorString=" + colorString + ", sex_male="
+ sex_male + ", health=" + health + "]";
}
/**
* get/set方法
*
* @return
*/
public String getNameString() {
return nameString;
}
public void setNameString(String nameString) {
this.nameString = nameString;
}
public int getMonth() {
return month;
}
public void setMonth(int month) {
this.month = month;
}
public String getColorString() {
return colorString;
}
public void setColorString(String colorString) {
this.colorString = colorString;
}
public char getSex_male() {
return sex_male;
}
public void setSex_male(char sex_male) {
this.sex_male = sex_male;
}
public int getHealth() {
return health;
}
public void setHealth(int health) {
this.health = health;
}
}
/**
* 测试类
*/
public class Test {
public static void main(String[] args) {
Cat cat = new Cat();
System.out.println(cat.toString());
}
}
包的创建和导入
为了更好的组织类,java提供了包机制。包是类的容器,如果没有指定包名,所有的实例都属于一个默认的无名包。
说白了,就是为了更好的组织类,防止在一个空间中出现类重名的现象,表明类之间的关系。
定义包
package 包名;
注意:
- 必须放在java源文件中的第一行
- 一个java源文件中只能有一个package语句
- 包名全部英文小写
- 命名方式:域名倒序+模块+功能
导入包
import 包名.类名;//导入包中指定类
import 包名.*;//导入包中全部类
静态变量和静态方法
static修饰符可以用来修饰属性、方法和代码块。static修饰的变量属于这个类所有,即由这个类创建的所有对象公用同一个static变量。通常把static修饰的属性和方法称为类属性(静态变量)和类方法(静态方法)。没有static修饰的属于单个对象,通常称为实例属性(实例变量)和实例方法。
最常见的例子就是main方法。
在加载类的过程中,完成静态变量的内存分配,再执行静态块(静态代码块,被“{”和“}”包裹的统称为代码块),两者是在创建对象之前执行的。
静态属性和静态方法可以通过类名和对象访问,实例属性和实例方法只能通过对象名访问静态方法只能访问静态属性和其他类方法。同时在静态方法中不能使用this和super(super后面会讲到)关键字。另外静态变量不能是局部变量。
还有,在使用常量时,为了方便调用,可以使用static来修饰,这时这个常量被称为静态常量。
新人勿喷,评论多多纠正!!!
上一篇: Gym平台在强化学习实验中的应用
下一篇: Java代码优化细节