目录
1.3 package、import和import static
三、面向对象编程(二)
1、隐藏和封装
1.1 理解封装
封装是面向对象编程的三大特征之一,它指的是将对象的状态信息隐藏在对象内部,
不允许外部程序直接访问对象的内部信息,而是通过该类提供的方法来实现对内部信息的操作和访问。
封装是面向对象语言对客观世界的模拟,就如人的年龄,只有随着岁月的更改才会改变,而通常不能用其他方法改变人的年龄对一个类进行良好的封装,可以实现以下目的:
(1)隐藏类的实现细节;
(2)让访问者通过事先预定的方法来访问数据,从而可以在该方法里加入控制逻辑,限制对成员变量的不合理访问;
(3) 可进行数据检查,从而有利于保证对象信息的完整性;
(4)便于修改,提高代码的可维护性。
为了实现良好的封装,需要从两个方面考虑。
(1)将对象的成员变量和实现细节隐藏起来,
(2)不允许外部直接访问.把方法暴露出来,让方法来控制对这些成员变量进行安全的访问和操作。
1.2 使用访问控制符
Java提供了3个访问控制符:private、protected、public,分别代表了3个访问控制级别,提供了4个访问控制级别。Java的访问控制级别由小到大,如图3.1所示:
图3.1访问控制级别由小到大
图中的Default并没有对应的访问控制符,当不使用任何访问控制符修饰类或类成员时,系统自动默认使用该访问控制级别。
private(当前类访问权限):如果类里的成员(包括成员变量、方法和构造器等)使用private来修饰,则这个成员只能在当前的类中访问;
default(包访问权限):在相同包下可以访问;
protected(子类访问权限):被protected修饰的成员,既可以被同一个包下的其他子类访问,又可以被在其他包下的子类访问。在通常情况下,如果使用protect来修饰一个方法,通常是希望其子类来重写这个方法;
public(公共访问权限):被它修饰的成员可以被所有类访问。
掌握了访问控制符的用法之后,下面通过使用合理的访问控制符来实现一个Person类,这个Person类实现了良好的封装。
程序如下:
public class Person{
private String name;
private int age;
public void setName(String name)
{
//执行合理性校验,要求用户名必须在2~6位之间
if(name.length()>6||name.length()<2)
{
System.out.println("您设置的人名不符合要求“);
return;
}
else
{
this.name=name;
}
}
public String getName()
{
return this.name;
}
public void setAge(int Age)
{
if(age>100||age<0)
{
System.out.println("您设置的年龄不合法");
return;
}
else
{
this.age=age;
}
}
public int getAge()
{
return this.age;
}
}
定义了上面的Person类之后,该类的name和age两个成员变量只有在Person类中可操作和访问,在Person类之外只能通过set和get方法访问。
1.3 package、import和import static
Java允许将一组功能相关的类放在同一个package下,从而组成逻辑上的类库单元。如果希望把一个类放在指定的包结构下,应该在Java源程序的第一个非注释行放置如下格式的代码:
package packageName;
一旦在Java源文件中使用了这个package语句,就意味着该源文件里定义的所有类都属于这个包。位于包中的每个类的完整类名都应该是包名和类名的组合,如果其它人需要使用该包下的类,也应使用包名加类名的组合。
如果创建处于其他包类下的实例,则在调用构造器时也需要使用包前缀。例如在lee.HelloTest类中创建lee.sub.Apple类的对象,则需要采用如下代码:
lee.sub.Apple a=new lee.sub.Apple;
//调用构造器时需要在构造器前增加包前缀
为了简化编程,Java引入了import关键字,import可以向某个Java文件中导入指定包层次下某个类或全部类,import语句应该出现在package语句之前、类定义之后。一个Java源文件只能包含一个package语句,但可以包含多个import语句。用法如下:
import package.subpackage···ClassName;
在一些极端的情况下,import语句也帮不了我们,此时只能在源文件中使用类全名。
静态导入需要用到import static,静态导入也有两种方法,分别用于指定类的单个静态成员变量、方法和全部静态成员变量、方法。
导入单个静态成员的语法格式:
import static package.subpackage···Classname.fieldName|methodName;
导入指定类的全部静态成员变量、方法的语法格式如下:
import static package.subpackage···ClassName.*;
其中*只能代表静态成员变量或方法名。
1.4 Java的常用包
一.java.lang包。该包提供了Java语言进行程序设计的基础类,它是默认导入的包。该包里面的Runnable接口和Object、Math、String、StringBuffer、System、Thread以及Throwable类需要重点掌握,因为它们应用很广。
二:java.util包。该包提供了包含集合框架、遗留的集合类、事件模型、日期和时间实施、国际化和各种实用工具类(字符串标记生成器、随机数生成器和位数组)。
三:java.io包。该包通过文件系统、数据流和序列化提供系统的输入与输出。
四:java.net包。该包提供实现网络应用与开发的类。
五:java.sql包。该包提供了使用Java语言访问并处理存储在数据源(通常是一个关系型数据库)中的数据API。
六:java.awt包、javax.swing包。这两个包提供了GUI设计与开发的类。java.awt包提供了创建界面和绘制图形图像的所有类,而javax.swing包提供了一组“轻量级”的组件,尽量让这些组件在所有平台上的工作方式相同。
七:java.text包。该包提供了与自然语言无关的方式来处理文本、日期、数字和消息的类和接口。