3. 封装
3.1封装概述
Java中封装的实质就是将类的状态信息隐藏在类内部,不允许外部程序直接访问,而是通过该类提供的方法开实现对隐藏信息的操作和访问。
封装反映了事物的相对独立性,有效避免了外部错误对此对象的影响,并且能对对象使用者由于大意产生的错误操作起到预防作用。同样面向对象编程提倡对象之间实现松耦合关系。
封装的好处在于隐藏类的实现细节,让使用者只能通过程序员规定的方法来访问数据,可以方便的加入存取控制修饰符,来限制不合理的操作。
注意:
松耦合就是指尽量减少对象之间的关联性,以降低他们之间的复杂性和依赖性。
3.2封装的步骤
1.修改属性的可见性
将Person类中的属性public修改为private即可
例:
将Person类的属性私有化
public class Person{
private String name;
private String gender;
private String age;
}
分析:将public修改为private后,其他类就无法访问,如果访问则需要进行封装的第二步
2.设置setter和getter()方法
例:
将Person类中的私有属性添加setter和getter()方法
public class Person{
private String name;
private String gender;
private int age;
public String getName(){
return name;
}
public void setName(String name){
this.name=name;
}
public String getGender(){
return gender;
}
pubic void setGender(String gender){
this.gender=gender;
}
public int getAge(){
return age;
}
public void setAge(int age){
this.age=age;
}
}
3.设置属性的存取限制
此时,还没对属性设置合法性检查,需要在setter方法中进一步利用条件判断语句进行赋值限制。
例:
为setter方法设置限制
public class Person {
public String name;
public int age;
public String gender;
public String getName(){
return name;
}
public void setName(String name){
this.name=name;
}
public String getGender(){
return gender;
}
public void setGender(String gender){
this.gender=gender;
}
public int getAge(){
return age;
}
//修改set方法,设置合法性检查
public void setAge(int age){
if (age<0||age>150) {
System.out.println("***输入年龄为"+age+",该年龄不合法,将重置***!");
return;
}
this.age=age;
}
//构造方法
public Person(){
this.name="无名氏";
this.gender="男";
this.age=18;
}
public Person(String name,String gender,int age){
this.name=name;
this.gender=gender;
this.age=age;
}
//方法:自我介绍方法:转义字符:\r表是把光标移到所在行开头;\n是把光标移到下一行开头
public void say(){
System.out.println("自我介绍以下\r\n姓名:"+this.name+"\r\n性别:"+this.gender+"\r\n年龄:"+this.age+"岁");
}
}
测试方法:
public static void main(String[] args) {
Person person = new Person();
person.setName("艾琳");
person.setAge(221);
person.setGender("少女");
person.say();
}
4.1包的概述
Java中的包机制也是封装的一种形式。
包的主要有以下方面的作用:
1).包允许将类组合成较小的单元(类似文件夹),易于找到和使用相应的类文件
2).防止命名冲突:Java中只有在不同包中的类才能重名。不同的程序员命名同名的类在所难免,类名就容易管理了,A定义了一个类Sort,封装在包A中,B定义了一个类Sort,封装在包B中,在使用时,为了区别A和B定义的Sort类,可以通过包名区分开,如A.Sort和B.Sort分别对应于A和B定义的Sort类。
4.2包的定义
定义包的语法格式如下:
package包名:
package是关键字
包的声明必须是Java源文件中的第一条非注释性语句,而且一个源文件只能有一个包声明语句,设计的
包需要与文件系统结构相对应。因此,在命名包时,要遵守以下编码规范。
1).一个唯一的包名前缀通常是全部小写的ASCII字母,并且是一个顶级域名com、edu、gov、net及org,通常使用组织的网络名的逆序。例如,如果域名为javagroup.net,可以声明包为“package net.javagroup.mypackage;”
2) 包名的后续部分依次不同机构各自内部的规范不同而不同。这类名规范可能以特定目录名的组成来区分部门、项目、机器或注册名、如“package net.javagroup.research.powerproject”。research表示项目名,
powerproject表示部门名
例如,下面的代码中,为了Person类定义了包cn.shujia.pack1。
package cn.shujia.pack1;
public class Person{
//省略类的内代码
}
4.3包的使用
例:
使用包将Person类和PersonTest类进行分类
import cn.shujia.pack1.Person;